Чт мар 01, 2018 07:45:50
if(f_mount (&fatfs, "",0)==FR_OK){
if(f_open(&fileW,(const char*)NameNewFile2,FA_OPEN_ALWAYS | FA_WRITE)==FR_OK){
result=f_write(&fileW, &inbuf[0], 512, &bw);
result=f_close(&fileW);
}
}else{
while(1){}
}
static void SD_StartBlockTransfer(uint8_t *buf, uint32_t cnt, uint32_t dir){
uint32_t count = 0, *tempbuff = (uint32_t *)buf;
//cnt must be integer multiple of 512!!! I will enforce this inside this function
//Starts the actual data tranfer using the DMA.
//Prior to calling this command. The SDCard must have been adjusted using commands
uint32_t tempreg;
//----------
//Make cnt an integer multiple of 512
//Then mask it with the maximum value allowed (2^24)
cnt=0x01FFFFFF & ((cnt>>8) << 8);
//----------
DMA2_Channel4->CCR=0;
DMA2->IFCR= DMA_IFCR_CTCIF3|DMA_IFCR_CTEIF3|DMA_IFCR_CGIF3|DMA_IFCR_CHTIF3;
//----------
DMA2_Channel4->CPAR=(uint32_t)&SDIO->FIFO;
DMA2_Channel4->CMAR=(uint32_t) buf; //Memory address;
//----------
DMA2_Channel4->CNDTR=cnt/4;
//----------
tempreg=0;
tempreg|=DMA_CCR3_MSIZE_0*0| // шины 32 бит
DMA_CCR3_MSIZE_1*1|
DMA_CCR3_PSIZE_0*0|
DMA_CCR3_PSIZE_1*1|
DMA_CCR3_PL_0*1| //приоритет Very hig
DMA_CCR3_PL_1*1|
DMA_CCR3_MINC*1; // память инкримент
//DMA_CCR3_TCIE*1;
if(dir==SD2UM){
tempreg&=~DMA_CCR3_DIR; //направление память периферия
}else if (dir==UM2SD) {
tempreg=DMA_CCR3_DIR*1;
}
//----------
DMA2_Channel4->CCR=tempreg;
//----------
DMA2_Channel4->CCR|=DMA_CCR3_EN; // ВКЛ DMA
//----------
//Clear the Data status flags
SDIO->ICR=(SDIO_STA_DCRCFAIL | SDIO_STA_DTIMEOUT | SDIO_STA_TXUNDERR | SDIO_STA_RXOVERR | SDIO_STA_DATAEND | SDIO_STA_STBITERR | SDIO_STA_DBCKEND);
//----------
//First adjust the Dtimer and Data length
SDIO->DTIMER=(uint32_t) DATATIMEOUT;
SDIO->DLEN=cnt;
//----------
//Now adjust DCTRL (and enable it at the same time)
tempreg=0; //Reset value
tempreg|=(uint32_t) 9 << 4; //Block size is 512 Compute log2(BlockSize) and shift 4bit
tempreg|= 1<<3; //Enable the DMA
tempreg|= 0<<2; //DTMode=Block Transfer (Actualy this is the reset value. Just a remainder)
tempreg|=(dir & SDIO_DCTRL_DTDIR); //Direction. 0=Controller to card, 1=Card to Controller
tempreg|=1; //DPSM is enabled
SDIO->DCTRL=tempreg;
//----------
//----------!!!Ожидание завершения приема/передачи!!!----------
//----------
//DMA2->IFCR|=DMA_ISR_GIF4|DMA_ISR_HTIF4;
while (!(DMA2->ISR&DMA_ISR_TCIF4)){}
DMA2->IFCR|=DMA_ISR_TCIF4|DMA_ISR_GIF4|DMA_ISR_HTIF4;
while (!(SDIO->STA & (SDIO_FLAG_DBCKEND))){}
while (SDIO->STA & (SDIO_STA_RXACT | SDIO_STA_TXACT)) {};
//----------
}
for(i=0;i<1000;i++){
SD_WriteSingleBlock(inbuf, 1);
memset(inbuf,0,512);
SD_ReadSingleBlock(inbuf, 1);
for(k=0;k<512;k++){
if(inbuf[k]!=0x66){
NOP;
}
}
}
Сб мар 03, 2018 08:32:16
Сб мар 03, 2018 16:43:31
void SD_WriteSingleBlock(uint8_t *buf, uint32_t blk) {
uint32_t WriteAddr;
uint32_t response;
//uint32_t response;
if (SDType==1) { //High Capacity
WriteAddr=blk;
} else if (SDType==0) {//Standard Capacity
WriteAddr=blk*512;
}
//CMD24:WRITE_SINGLE_BLOCK
SD_Command(CMD24, SHRESP, WriteAddr);
SD_Response(&response, RESP_R1);
//Card is now waiting some data from the Data lines. Start actual data transmission
SD_StartBlockTransfer(buf, 512, UM2SD);
//Wait for transmission to end
SD_WaitTransmissionEnd();
}