SPI

Michal Grunt michal.grunt na vynet.cz
Čtvrtek Srpen 29 14:19:31 CEST 2013


Připojení SD karty pomocí SPI na STM32F0:
- Objednal jsem si z Ebay PCB s držákem na SD kartu, ale už jsem nevěnoval pozornost tomu co je dalšího na plošném spoji. Bylo to určené pro 5V Arduino (já to připojoval na 3V jak napájení tak IO), takže u každého IO byl dělič a ještě tam byl stabilizátor z 5V na 3.3V, který samozřejmě po připojení 3V (místo 5V) nefungoval. Takže jsem jeho vstup a výstup zkratoval. Dále bylo nutné odpájet děliče (cca 8 SMD rezistorů) a místo 4 rezistorů udělat propojky. Takže na plošáku kromě držáku karty a konektoru nic nezbylo.
- SPI jsem ještě nepoužíval (mimo připojení LCD z Nokie 5110, ale tam se nekonfiguruje vstup, pouze výstup) takže jsem si nebyl jist zda mám dobře nakonfigurovaný SPI vstup
- nechtělo se mi psát od začátku ovládaní SPI, příkazy SD karty atd. takže jsem to spojil asi ze dvou různých projektů
- v kódu byla chyba u funkce send_cmd http://www.mikrocontroller.net/topic/291979 kde musí s CS pinem zacvičit - v kódu je zakomentovaná jedna řádka (SDDESELECT) a ta se musí povolit (porovnával jsem několik jiných kódů pro ovládání SD karty přičemž všechny byly stejné až tady na to)

-----Original Message-----
From: hw-list-bounces na list.hw.cz [mailto:hw-list-bounces na list.hw.cz] On Behalf Of JP
Sent: Thursday, August 29, 2013 10:56 AM
To: HW-news
Subject: Re: SPI

Mozna by bylo dobre napsat jakou chybku, nekomu by se to treba nekdy hodilo.

On 27.8.2013 23:33, Michal Grunt wrote:
> Ano mám to přeložené s podporou zápisu. Nicméně našel jsem chybu ve funkci send_cmd takže už mi to funguje! Paráda. Už jsem v to ani nedoufal... Děkuji za nakopnutí.
>
> ________________________________________
> Odesílate: hw-list-bounces na list.hw.cz [hw-list-bounces na list.hw.cz] za 
> uživatele Ondrej [leguanolog na seznam.cz]
> Odesláno: 27. srpna 2013 19:34
> To: HW-news
> Předmět: Re: SPI
>
> A mate fatfs přeložené s podporou zápisu? A co implementace write fce 
> na samotnou kartu?
>
> Dne 27.8.2013 17:14, Michal Grunt napsal(a):
>> Trošku jsem pokročil. Inicializace SPI už je v pořádku a přístup na FAT skoro taky. Vypíšu seznam souborů, jejich obsah, vytvořím soubor, ale už do něj nemohu zapsat. Zápis skončí na ve funkci f_write na řádku if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); (předposlední řádek - níže). Nesetkal se s tím někdo? Mám tu dvě SD karty. Jedna 256MB nejde vůbec zinicializovat (ale v počítači funguje), druhá je 2GB. Ta už je na tom lépe, ale nejde na ni zapisovat (mimo vytvoření prázdného souboru).
>>
>> Díky, MG
>>
>> http://d264.googlecode.com/svn/trunk/ext/fatfs/ff.c
>>
>> FRESULT f_write (
>>        FIL *fp,                        /* Pointer to the file object */
>>        const void *buff,       /* Pointer to the data to be written */
>>        UINT btw,                       /* Number of bytes to write */
>>        UINT *bw                        /* Pointer to number of bytes written */
>> )
>> {
>>        FRESULT res;
>>        DWORD clst, sect;
>>        UINT wcnt, cc;
>>        const BYTE *wbuff = buff;
>>        BYTE csect;
>>
>>        *bw = 0;        /* Initialize byte counter */
>>
>>        res = validate(fp);                                             /* Check validity */
>>        if (res != FR_OK) LEAVE_FF(fp->fs, res);
>>        if (fp->flag & FA__ERROR)                               /* Aborted file? */
>>                LEAVE_FF(fp->fs, FR_INT_ERR);
>>        if (!(fp->flag & FA_WRITE))                             /* Check access mode */
>>                LEAVE_FF(fp->fs, FR_DENIED);
>>        if ((DWORD)(fp->fsize + btw) < fp->fsize) btw = 0;      /* File size cannot reach 4GB */
>>
>>        for ( ;  btw;                                                   /* Repeat until all data written */
>>                wbuff += wcnt, fp->fptr += wcnt, *bw += wcnt, btw -= wcnt) {
>>                if ((fp->fptr % SS(fp->fs)) == 0) {     /* On the sector boundary? */
>>                        csect = (BYTE)(fp->fptr / SS(fp->fs) & (fp->fs->csize - 1));    /* Sector offset in the cluster */
>>                        if (!csect) {                                   /* On the cluster boundary? */
>>                                if (fp->fptr == 0) {            /* On the top of the file? */
>>                                        clst = fp->sclust;              /* Follow from the origin */
>>                                        if (clst == 0)                  /* When no cluster is allocated, */
>>                                                fp->sclust = clst = create_chain(fp->fs, 0);    /* Create a new cluster chain */
>>                                } else {                                        /* Middle or end of the file */
>> #if _USE_FASTSEEK
>>                                        if (fp->cltbl)
>>                                                clst = clmt_clust(fp, fp->fptr);        /* Get cluster# from the CLMT */
>>                                        else #endif
>>                                                clst = create_chain(fp->fs, fp->clust); /* Follow or stretch cluster chain on the FAT */
>>                                }
>>                                if (clst == 0) break;           /* Could not allocate a new cluster (disk full) */
>>                                if (clst == 1) ABORT(fp->fs, FR_INT_ERR);
>>                                if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR);
>>                                fp->clust = clst;                       /* Update current cluster */
>>                        }
>>
>> -----Original Message-----
>> From: hw-list-bounces na list.hw.cz [mailto:hw-list-bounces na list.hw.cz] 
>> On Behalf Of Michal Grunt
>> Sent: Saturday, August 24, 2013 1:13 PM
>> To: HW-news
>> Subject: RE: SPI
>>
>> Tak po odpojení modulu jde MISO do H (když jsem měl modul zapojený zkoušel jsem MISO i ručně donutit he stavu H, ale nešlo nic, pořád zůstával ve stavu L). Zkusím překontrolovat HW modulu.
>>
>> ________________________________________
>> Odesílate: hw-list-bounces na list.hw.cz [hw-list-bounces na list.hw.cz] za 
>> uživatele Pavel Kutina [hw na prelude.cz]
>> Odesláno: 24. srpna 2013 01:38
>> To: HW-news
>> Předmět: Re: SPI
>>
>> A bez karty nebo bez celeho modulu je take stale v nule (jen pro vylouceni HW problemu)? O STM nevim nic, ale zrovna vcera mne podobne vyskolil Stellaris od TI na daleko trivialnejsi zalezitosti - ja se snazil cist dve tlacitka, jedno chodilo, druhe ne, navic to, ktere chodilo, melo navic nejakou sdilenou funkci pinu, takze tam bylo o dost vic prostoru pro chybu, to druhe bylo ciste.
>>
>> Inicializoval jsem je stejne, jen to na tom cistem GPIO nejelo. Nakonec jsem zjistil, ze jsem je inicializoval blbe oba dva GPIO, jen to na tom sdilenem pinu melo pull-up hardwarovy jeste "pres neco" externe na desce, takze i kdyz jsem zkonil inicializaci GPIO, stejne tam byl a tlacitko do nuly vesele spinalo... To potesilo - asi dve hodiny procitani dokumentace, nastavovani registru - a nenapadlo me podivat se do schematu i na ten funkci pin...
>>
>> Takze pokud je to SW spravne (asi ano, tenhle kod vypada podezrele podobne:
>> https://my.st.com/public/STe2ecommunities/mcu/Lists/STM32Discovery/At
>> tachments/4993/main.c) tak bych se zkusil podivat po zeleze...
>>
>> Pavel Kutina
>>
>>
>> ----- Original Message -----
>> From: "Michal Grunt" <michal.grunt na vynet.cz>
>> To: <hw-list na list.hw.cz>
>> Sent: Saturday, August 24, 2013 1:02 AM
>> Subject: SPI
>>
>>
>> Zdravím, už pár hodin bojuju s SPI na STM32 (F0) a nějak nemůžu přijít na to kde je problém. Na logickem analyzátoru vidím průběhy MOSI, SCK a CS, ale MISO si ani neškrtne, je pořád v L (jedná se o připojení SD karty s tímto modulem http://www.ebay.com/itm/251289364968 ). SD karty jsem zkoušel dvě (2GB a 256MB). Mám vůbec dobře nakonfigurované GPIO?
>>
>> RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); 
>> RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
>>
>> // MISO -> PA6
>> GPIO_StructInit (&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = 
>> GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; 
>> GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
>> GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
>> GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, 
>> &GPIO_InitStructure);
>>
>> GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0); // MISO
>>
>> Pro jistotu ještě uvedu konfiguraci SPI
>>
>> SPI_Cmd(SPI1, DISABLE);
>> SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 
>> SPI_InitStructure.SPI_Mode = SPI_Mode_Master; 
>> SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; 
>> SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA 
>> = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; 
>> SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128; 
>> // 42000kHz/128=328kHz < 400kHz SPI_InitStructure.SPI_FirstBit = 
>> SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; 
>> SPI_Init(SPI1, &SPI_InitStructure); SPI_RxFIFOThresholdConfig(SPI1, 
>> SPI_RxFIFOThreshold_QF); SPI_CalculateCRC(SPI1, DISABLE); 
>> SPI_Cmd(SPI1, ENABLE);
>>
>> Děkuji za odpověď, MG
>> _______________________________________________
>>

_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz Hw-list na list.hw.cz http://list.hw.cz/mailman/listinfo/hw-list


Další informace o konferenci Hw-list