Пробую записать 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;
}
{
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;
}
{
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;
}
И еще никаких подтяжек нету на чипе памяти.
Чип соединен с платой Дискавери короткими проводами, скорость передачи малая.
Чип отзывается нормально на простые команды приведенные выше в процессе коммуникации.
Что еще я тут мог упустить?