Sunday, July 23rd 2017, 10:39pm UTC+2

You are not logged in.

  • Login
  • Register

Dear visitor, welcome to SEGGER Forum. If this is your first visit here, please read the Help. It explains how this page works. You must be registered before you can use all the page's features. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

Dave_A

Beginner

Date of registration: Mar 8th 2017

Posts: 4

1

Wednesday, March 8th 2017, 5:38pm

MMC_SPI - Reads but won't write

This problem really has me stumped.

I'm using emFile to interface a NAND flash and SD card on my own hardware. The NAND works perfectly, no issues.

The SPI MMC/SD is another issue. If my application allowed, I could probably stream a MP3 off of the SD card, but I can't seem to write to it. Yes, I have checked that the card is not write-protected.

This is what emFile is reporting:
FS error: MMC_SPI: _WriteSectors: Data not accepted.
FS error: MMC_SPI: _WriteSectors: Data not accepted.
FS error: MMC_SPI: _WriteSectors: Command not accepted.
FS error: MMC_SPI: _WriteSectors: Command not accepted.
FS error: LOGBLOCK: Failed to write sector(s): 0x000080FD-0x000080FD to "mmc:0:".

After this, the card is not accessible. For example, I can't do a directory listing. I have to remove the card, and re-insert it into the holder to gain access again.

These errors were obtained when I ran the sample code that just writes a simple text file. The file creation is successful, but the file is empty.

Some board specifics:
STM32F303VE processor running at 72Mhz.
(SPI3) SPI clock rate is 281khz as measured with a scope.
emFile version V4.04a

I have tried a couple different cards. Both had a FAT file system and when that didn't work, I formatted one of them to a FAT32 file system (didn't fix anything).

Any direction would be helpful. I'm not sure where to look.

Thanks,
Dave

Dave_A

Beginner

Date of registration: Mar 8th 2017

Posts: 4

2

Wednesday, March 8th 2017, 10:37pm

I didn't think to check this yesterday, but I did today. The volume is mounted read/write.... so that's not it.

SEGGER - Marius

Super Moderator

Date of registration: Aug 10th 2011

Posts: 23

3

Thursday, March 9th 2017, 9:57am

Hello Dave,

We are not aware of this behavior.

The error messages suggest that the SPI data transfer is not working properly.
I suggest you to check first if the SPI controller is correctly configured:
- Data is sampled on the rising edge of the clock signal.
- The clock signal is HIGH in idle state.
You can find more information in the section "6.5.8.1.8 (*pfWrite)()" of the emFile manual.

Best regards,
Marius

Dave_A

Beginner

Date of registration: Mar 8th 2017

Posts: 4

4

Thursday, March 9th 2017, 9:20pm

[SOLVED] but I can't explain it... very well.

The code I used to send multi bytes of data to the MMC/SD card:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  /* Check flags to make sure SPI is idle */
  SPI_WAIT(SD_CARD_SPI);

  do {
	/* Send byte of data */
	SPI_SendData8(SD_CARD_SPI, *pData++);
	
	/* Wait for SPI complete send */
	SPI_WAIT(SD_CARD_SPI);
	
	/* Read data register */
	(void)SPI_CARD_SPI->DR;
	
  } while (--NumBytes);


Looks reasonable, right? Except, remember that the data register is a 16-bits in the STM32F303 (and others).

When I change the code to this:

Source code

1
2
	/* Read data register */
	SPI_ReceiveData8(SD_CARD_SPI);

Everything works great. The call to function only reads 8-bits from the register and not 16 like I originally had. Again, it works but I can't really explain why reading the "throw away" data differently makes it work.

Credit given to Tilen Majerle for his SPI code that I adapted.

Thanks for the response. You were right... it was in the pfWrite code, but not how I imagined it would be.

Dave