SPI

JP dodo.hw na jnc.cz
Čtvrtek Srpen 29 10:55:59 CEST 2013


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/Attachments/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
>> _______________________________________________
>>



Další informace o konferenci Hw-list