SPI

Ondrej leguanolog na seznam.cz
Úterý Srpen 27 19:34:32 CEST 2013


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
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz Hw-list na list.hw.cz http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz Hw-list na list.hw.cz http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz Hw-list na list.hw.cz http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> 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