реклама на сайте
подробности

 
 
> STM32F4 + SPI FLASH MX25L256, Данные читаются неверно
BlackOps
сообщение May 20 2013, 09:12
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121



Написал набор функций для записи данных во ФЛЭШ память.
Пробую записать 256 одинаковых байт на страницу начальную памяти, ну и затем их считать, байты записываются как надо, проверял осциллографом, а вот считываются неверные.

т.е. записал скажем 256 байтов, каждый со значением 0xaa, а считываю 256 байтов и все со значением 0x80.
Я пробовал записать другой байт в количестве 256, считывалось тоже самое, а иногда считывается совсем другое число, но тоже в количестве 256. А один раз помню даже заработало как надо! Но это только один раз, а в общем считываются неверно.

Причем считывание проверял не только в дебаггере, но и на ножках микросхемы памяти (т.е. это не СТм32 портит полученные данные)


Ну вот мой код основной:
CODE

mem_init(); // изначально поднять сигнал сs

mem_xferstart();
mem_wren();
mem_xferend();


mem_xferstart();
status_reg = mem_rdsr();
mem_xferend();

// брейкпоинт
mem_xferstart();
mem_pp();
mem_xferend();


mem_xferstart();
status_reg = mem_rdsr();
mem_xferend();
//брейкпоинт

mem_xferstart();
status_reg = mem_rdsr();
mem_xferend();

//брейкпоинт
mem_xferstart();
mem_read();
mem_xferend();


а вот каждая функция в отдельности
CODE

uint8_t mem_xferstart(void)
{
GPIOx->ODR &= !CS_PIN; // pull LOW CS
return 0;
}




uint8_t mem_xferend(void)
{
while ( (( (SPIx -> SR) & SPI_SR_BSY ) == SET) ) ;

GPIOx->ODR |= CS_PIN;

return 0;
}




uint8_t mem_getbyte(void)
{
// check if there is a byte in shift register
while ( (( (SPIx -> SR) & SPI_SR_TXE ) == RESET) ) ;

SPIx -> DR = 0xff; // send dummy byte

// check if there is a byte in shift register
while ( (( (SPIx -> SR) & SPI_SR_RXNE ) == RESET) ) ;

return SPIx->DR;
}





uint8_t mem_sendbyte(uint8_t sendbyte)
{

// check if sent byte came back to shift reg.
while ( (( (SPIx -> SR) & SPI_SR_TXE ) == RESET) ) ;

SPIx -> DR = sendbyte; // send byte

// check if sent byte came back to shift reg.
while ( (( (SPIx -> SR) & SPI_SR_RXNE ) == RESET) ) ;

return SPIx->DR;
}





uint8_t mem_rdsr(void)
{

uint8_t sreg= 0;

//mem_xferstart();
mem_sendbyte(RDSR);
sreg = mem_getbyte();


return sreg;
}




uint8_t mem_wren(void)
{



//mem_xferstart();
mem_sendbyte(WREN);


return 0;
}



вот конкретно функция записи 256 байт
CODE
uint8_t mem_pp(void)
{

uint8_t btw[256];
uint8_t byteread = 0;
int i = 0;

// init the array of 256 bytes
for(i=0;i<=255;i++)
{
btw[i]=0xaa;
}

//mem_xferstart();
mem_sendbyte(PP);
mem_sendbyte(0x0);
mem_sendbyte(0x0);
mem_sendbyte(0x0);


for(i=0;i<=255;i++)
{
mem_sendbyte(btw[i]);
}



return 0;
}



а вот функция чтения 256 байт
CODE
uint8_t mem_read()
{

uint8_t btr[256]; // array for read bytes

int i = 0; // loop var.

// init the array of 256 bytes with zeros
for(i=0;i<=255;i++)
{
btr[i]=0;
}


mem_sendbyte(READ); // READ command
mem_sendbyte(0x0); // address
mem_sendbyte(0x0);
mem_sendbyte(0x0);

// read every byte into array of bytes
for(i=0;i<=255;i++)
{
btr[i] = mem_getbyte();
}







//for (;;);

return 0;
}


И еще никаких подтяжек нету на чипе памяти.
Чип соединен с платой Дискавери короткими проводами, скорость передачи малая.
Чип отзывается нормально на простые команды приведенные выше в процессе коммуникации.

Что еще я тут мог упустить?

Сообщение отредактировал IgorKossak - May 20 2013, 13:33
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 5th July 2025 - 22:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01372 секунд с 7
ELECTRONIX ©2004-2016