Straipsnis skirtas tiems MCU kurie turi SDIO geležį.
Visur yra straipsniai apie SPI SD kortelės pajungimą arba kur jau rimtesnė techniką, tai SDIO su keturiais duomenų kanalais. Tačiau nebūtina naudoti visus kanalus, galima jungti ir per vieną. Todėl, kad prijungti SD kortelę užtenka 5 laidų: Vcc ir žemė, lieka trys duomenims. Reikia SDIO_SC (clock), SDIO_CMD ir SDIO_D0. Jei norim greitesnio skaitymo- D1, D2, D3.
Surašysiu ką aš dariau, kad šios dienos (2022.12.23) STM32CubeMX pagimdytų veikiantį kodą. Seniau reikėdavo naudoti išorinę biblioteką (dažniausiai FatFS iš elm-chan), dabar šią biblioteką kubikas automatiškai įkelia ir sukonfiguruoja. Dar karta pabrėžių – viską padaro. Nereikia rašyti jokių disk-io paprogramių. Nieko nereikia rašyti.
Pradedam nuo SDIO modulio aktyvavimo:
Režimas – 1 bitas, būtinai reikalingas pertraukimas. Nors sako, kad veikia be jo. Man neveikė. DMA galima jungti, bet nepastebėjau ko nors. Kitas parametras: SDIOCLK clock divide factor – pasididinkit, nes ant pilno greičio ne visos SD kortelės gali dirbti (ypač pajungtos ant snarglių). Aš parašiau -4, prie 72MHz SDIO clock.
Kad veiktų fatfs, reikia dar vieno GPIO pino. Be jo neleis sukonfiguruoti. Taip laidelis einantis iš lizdelio kur jungiasi prie mechaninio mygtuko- inkišta kortelė ar ne. Nors programiškai tas pinas naudojamas tik vienoje vietoje, kubikas reikalauja.
GPIO input, pull-up tikriausiai, jei jungiklis trumpina į žemę.
Ir tik dabar galima įjungti Middleware->FATFS.
Čia matosi tas “privalomas” D3 GPIO.
Dar galima prasisukti per fatfs nustatymus ir išjungti nereikalingas funkcijas, kad sutaupyti atminties (ypač) RAM.
Susigeneruojam kodą, ir kiek pasikuičiam jame…
Failas “fatfs_platform.c” – jame yra SD kortelės detektavimas per tą PINą. Pasitaisom kodą pagal jūsų mygtuką, arba paprasčiausia parašom “return SD_PRESENT;“. Šį failą privalom pataisyti.
Jei naudojam RTC ar šiaip ką nors sumintijom su laikrodžiu ir norim turėti failus su data, tai atsidarom failą “fatfs.c” ir pasitaisom funkciją “get_fattime(void)“.
Kaip ir viskas. O pačiu fatfs naudotis galima pagal šitą:
void test_fatfs(void) { //some variables for FatFs FATFS FatFs; //Fatfs handle FIL fil; //File handle FRESULT fres; //Result after operations //Buffer for reading/writing BYTE readBuf[30]; //Open the file system fres = f_mount(&FatFs, "/", 1); //1=mount now if (fres == FR_OK) { //open file for reading fres = f_open(&fil, "test.txt", FA_READ); if (fres == FR_OK) { //We can either use f_read OR f_gets to get data out of files //f_gets is a wrapper on f_read that does some string formatting for us TCHAR* rres = f_gets((TCHAR*)readBuf, 15, &fil); if(rres != 0) { print_uart((char *)readBuf); } else { //error //print_uart("f_gets error \r\n"); } } f_close(&fil); // end of file read // file write //Now let's try and write a file "write.txt" fres = f_open(&fil, "write.txt", FA_WRITE | FA_OPEN_ALWAYS | FA_CREATE_ALWAYS); if(fres == FR_OK) { //Copy in a string strncpy((char*)readBuf, "new file is made!2", 20); UINT bytesWrote; fres = f_write(&fil, readBuf, 19, &bytesWrote); if(fres == FR_OK) { // file ok } else { //file write error } } else { // file open error } //Don't forget to close your file! f_close(&fil); //end of file write } else { //mount error } //We're done, so de-mount the drive f_mount(NULL, "", 0); //end of file testing }
Tai disko atidarymas, skaitymas ir rašymas.
Erratum:
Jei neveikia, pasitikrink schemą, ar yra 10kΩ rezistoriai ant visų linijų link maitinimo pliuso.
Jei veikia ir lūžta- pasididink steką.
Jei prie šio modulio pradėjo neveikti UART4/USART3, tai žinokit čia šūdina mikroschema ir ji sunaikino PC10 piną. Naudokit alternatyvius UART pinus. Naujesnėse mikroschemose tai pataisyta.
Normaliam darbui reikia kontroliuoti SD kortelės ištraukimą ir įkišimą. Taip pat organizuoti pačios kortelės ir SDIO interfeiso perleidimą iš naujo. Testuojant pastebėta, kad kartais SD kortelė dingsta, o kartais kortelės turinys visiškai susigadina.
„… tai žinokit čia šūdina mikroschema“ – ar įmanoma vizualiai nustatyt, kad STM su bugu, turbūt pagal kokį serijos numerį? Ir kokia PC10 susinaikinimo prevencija brokuotos atveju, išvis nenaudot šio išvado ar tiesiog jo nepriskirt UART/USART sąsajai?
Kiek suprantu, pagal “SSTM32F101xF/G STM32F103xF/G Errata sheet” tai hardwarinis bugas. Kitose versijose irgi pasitaiko…
Oficiali citata:
2.8.7 SDIO with USART3 remapped and UART4
Description
When SDIO is configured in 1-bit mode, there are conflicts with the USART3_TX pin remapped and with the UART4_TX pin. Conflicts are between the following signals:
•USART3_TX and SDIO_D2
•UART4_TX and SDIO_D2
Workaround
Use USART3_TX either in the default configuration (on the PB10 I/O) or remap USART3_TX to PD8 when the SDIO is being used.
Do not use UART4_TX when the SDIO is being used.
Nenaudoti to pino ir tiek. Arba naudoti naujos serijos mikroschemą- STM32F4xx. Kadangi aš turiu F1 serijos klodus, tai nieko ir nedariau.