Перейти к содержанию
    

STM32 и adesto AT45DB641E.

Привет, есть вопрос по этой памяти. Пытался писать в буфер и читать оттуда, пока не получается. На другой карточке не проверить.

Общаюсь с микросхемой успешно, информацию успешно читаю, как и отправляю. Читаю так:

    CS_ON();
    SerN = 0x9F;
    HAL_SPI_Transmit(&hspi3, &SerN, 1, 100);
        HAL_SPI_Receive(&hspi3, (uint8_t*)&SpiData, 5, 100);
    CS_OFF();
    HAL_UART_Transmit(&huart2, (uint8_t*)&SpiData, 5, 100);

 

В ответ приходит то, что и в даташите. Читаю CommTest'ом:

 1Fh (.), 28h ((), 00h (.), 01h (.), 00h (.)

 

Но вот писать в буфер или считывать оттуда не получается, пробовал записывать и считать один бит. Тишина пока.

 

Решил проверить состояние памяти. На выходе получил ответ:

BCh (.), 88h (.)

Все биты в обоих байтах соответствуют нормам, кроме последних. Почему-то устройство висит в состоянии: Device is busy with an internal operation. Хотя никакого общения в этот момент с ним нет.

WP и reset подтянуты.

В чем проблема может быть?

P.s. Сильно не пинайте, занимаюсь плотно STM32 как и программированием чуть больше 3х месяцев.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ошибку понял, байт прочитал задом наперед.

Изменено пользователем alexbbs

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Опять какой-то бред с памятью. Почему-то неправильно читает буфер, хотя пишет в буфер нормально. Как пример: обнуляем первую страницу, читаем непрерывным чтением командой 0xD2, в ответ получаем:

 FFh (.)FFh (.)...........FFh (.)

То есть страница обнулена и заполнена единицами, все ОК!.

Далее, делаем тоже самое, но через буфер:

Читаем страницу в буфер 1 командой:

void ReadPageBuff1(uint16_t addr_page)
{
    uint8_t Data;
    Data =  MM_PAGE_TO_B1_XFER;
    HAL_SPI_Transmit_DMA(&hspi3, &Data, 1);
    while ( HAL_DMA_GetState(&hdma_spi3_tx) != HAL_DMA_STATE_READY);
    Data = ((uint8_t)(addr_page >> 8));
    HAL_SPI_Transmit_DMA(&hspi3, &Data, 1);
    while ( HAL_DMA_GetState(&hdma_spi3_tx) != HAL_DMA_STATE_READY);
    Data = ((uint8_t)(addr_page));
    HAL_SPI_Transmit_DMA(&hspi3, &Data, 1);
    while ( HAL_DMA_GetState(&hdma_spi3_tx) != HAL_DMA_STATE_READY);
    Data = 0x00;
        HAL_SPI_Transmit_DMA(&hspi3, &Data, 1);
    while ( HAL_DMA_GetState(&hdma_spi3_tx) != HAL_DMA_STATE_READY);
}

Где "MM_PAGE_TO_B1_XFER" = 0x53

Далее читаем из буфера1 командой:

CS_ON();            
ReadPageBuff1(0x0000);
CS_OFF();

CheckSTAT();
        
CS_ON();            
ReadBuff1(0x00);
HAL_SPI_Receive_DMA(&hspi3, (uint8_t*)&SpiData, 255); //data out
while ( HAL_DMA_GetState(&hdma_spi3_rx) != HAL_DMA_STATE_READY);  
CS_OFF();
CheckSTAT();
HAL_UART_Transmit(&huart2, (uint8_t*)&SpiData, 255, 0xFFFF);

И на выходе получаем, вставлю полностью:

E4h (.), 42h (B)
82h (.), 35h (5), 5Eh (^), 21h (!), D3h (.), B3h (.), 9Dh (.), 6Eh (n), 6Eh (n), 4Ah (J), 9Ch (.), B3h (.), 9Dh (.), 92h (.), 0Eh (.), 14h (.), 3Fh (?), E4h (.), 53h (S), 67h (g), 89h (.), 1Ah (.), 89h (.), FBh (.), B7h (.), 6Ch (l), 1Eh (.), C1h (.), 27h ('), 71h (q), B0h (.), 09h (.), 68h (h), A9h (.), 09h (.), EAh (.), E5h (.), C2h (.), 0Ch (.), 0Ch (.), 26h (&), 58h (X), 3Eh (>), 29h ()), 65h (e), C6h (.)
1Dh (.), D3h (.), BDh (.), 38h (8), FDh (.), 44h (D), 62h (b), E6h (.), 53h (S), 43h (C), 23h (#), 91h (.), 88h (.), D2h (.), 2Ah (*), 1Eh (.), 9Fh (.), 3Fh (?), 6Eh (n), A7h (.), 85h (.), 44h (D), 88h (.), D4h (.), F1h (.), BAh (.), F4h (.), 5Ch (\), 4Ch (L), B4h (.), 43h (C), B5h (.), F9h (.), CAh (.), 02h (.), CAh (.), 4Fh (O), 2Ch (,), EBh (.), 70h (p), F9h (.), 67h (g), 56h (V), A4h (.), 22h ("), F9h (.), 7Ah (z)
37h (7), F6h (.), 56h (V), B4h (.), 48h (H), 95h (.), C4h (.), E6h (.), BEh (.), 8Bh (.), C6h (.), 6Fh (o), E1h (.), 77h (w), 00h (.), E4h (.), 8Bh (.), C0h (.), 6Dh (m), 13h (.), F1h (.), A7h (.), 14h (.), 8Fh (.), 3Fh (?), 00h (.), AAh (.), FCh (.), F9h (.), ECh (.), 37h (7), 41h (A), 5Fh (_), A3h (.), 0Ch (.), FDh (.), A9h (.), 38h (8), FAh (.), D7h (.), 1Ch (.), CBh (.), 84h (.), 22h ("), A9h (.), 58h (X), 37h (7), FBh (.), E4h (.), 05h (.), EFh (.), 08h (.)
96h (.), DDh (.), 12h (.), 7Eh (~), C7h (.), A2h (.), CAh (.), 80h (.), A6h (.), AAh (.), AAh (.), 38h (8), 81h (.), 38h (8), 4Eh (N), BDh (.), 74h (t), 02h (.), EAh (.), 00h (.), 49h (I), 5Eh (^), 2Fh (/), 0Dh (.), 01h (.), A1h (.), 82h (.), 43h (C), 12h (.), 41h (A), 75h (u), DAh (.), 95h (.), 9Fh (.), 0Ch (.), 80h (.), A4h (.), 5Ch (\), 64h (d), 4Bh (K), 73h (s), 11h (.), 49h (I), 15h (.), 21h (!), 65h (e)
BFh (.), 82h (.), 17h (.), 0Ah (.), 58h (X), ACh (.), 30h (0), 36h (6), F3h (.), 17h (.), 7Dh (}), 8Fh (.), F7h (.), 21h (!), 32h (2), 6Ah (j), 27h ('), 3Ah (:), C0h (.), 27h ('), C1h (.), 8Dh (.), FBh (.), 6Ch (l), 06h (.), C6h (.), 43h (C), ABh (.), D8h (.), ADh (.), D6h (.), F8h (.), BAh (.), 10h (.), 08h (.), 49h (I), 42h (B), 64h (d), B7h (.), 3Dh (=), 7Ch (|), DAh (.), 4Eh (N), D3h (.), 93h (.), 00h (.), 42h (B), E0h (.), 34h (4), 83h (.), 1Ah (.), 57h (W)
0Dh (.), C1h (.), 48h (H), 44h (D), 5Eh (^), 32h (2), B5h (.), BBh (.), 06h (.), 8Ch (.)

Что явно не похоже на то, что находится в буфере 1. Проверял буфер 2, результат аналогичный. Где косяк, понять не могу.

 

Более того, запись через буфер (к примеру времени с RTC) проходит , но с мусором, то есть если пишем к примеру время командой:

HAL_RTC_GetTime(&hrtc, &MyTime, RTC_FORMAT_BCD );
HAL_RTC_GetDate(&hrtc, &MyDate, RTC_FORMAT_BCD);
sprintf (msg, "TIME: %02d : %02d : %02d \n \r", ((MyTime.Hours & 0x0F) + ((MyTime.Hours & 0xF0)>>4)*10 ) ,( (MyTime.Minutes & 0x0F) + ((MyTime.Minutes & 0xF0)>>4)*10 ), ((MyTime.Seconds & 0x0F) + ((MyTime.Seconds & 0xF0)>>4)*10));
               
msg_size = strlen(msg);
CS_ON();            
ReadPageBuff1(0x0000);
CS_OFF();

CheckSTAT();
            
CS_ON();
uint8_t Data;
WriteBuff1(0x00);
for (uint8_t i=0; i<msg_size; i++)
{
    Data  = msg[i];
    HAL_SPI_Transmit_DMA(&hspi3, &Data, 1);
    while ( HAL_DMA_GetState(&hdma_spi3_tx) != HAL_DMA_STATE_READY);
}
CS_OFF();

CheckSTAT();

CS_ON();
WritePageBuff1(0x0000);
CS_OFF();

На выходе получаем ответ:

TIME: 00 : 02 : 11 

.é< t$F!Ú¦a¢¦eLLÌß=Á(8"tqDGsw¢HcO
Ö=À¦ÂÉrxSÊÌTx^¨ßÃ-ê]VCÒbtÒA•Â
Ü!0ý-º+
T0è;nG*L¦u!Ó'êÆd¯+1·È+ÚÉjhTð+C~)ÄVèr¦vR¿%ú&
ÙèÎîã aH"Gõ-    +ÏéǬ¨*ÐßDÀ*.IXOØ>âPÙW ~"Nãè%pè+CL$ØÙââÓh    LÇ-\\
Âb-¯

 

Ок... записал, но с мусором. Теперь заполним буфер данными и 0x00:

for (uint8_t i=0; i<255; i++)
{
    Data  = msg[i];
    HAL_SPI_Transmit_DMA(&hspi3, &Data, 1);
    while ( HAL_DMA_GetState(&hdma_spi3_tx) != HAL_DMA_STATE_READY);
}

Читаем результат:

54h (T), 49h (I), 4Dh (M), 45h (E)
3Ah (:), 20h ( ), 30h (0), 30h (0), 20h ( ), 3Ah (:), 20h ( ), 30h (0), 30h (0), ....... все нули..... 00h (.)

 

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

Буфер работает на запись в него, и все отлично работает. Но буфер, не работает на чтение из памяти в него.

Правильную логику редактирования страницы я вижу так:

-Считали страницу в буфер памяти.

-Записали байты со смещением.

-Закатали страницу обратно с предварительным удалением страницы.

 

И тут вопрос, что есть аналогичное и хорошо работающее где-то 64 мбита.

Изменено пользователем AlexandrY

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Работал и работаю с этой памятью. Правда с 321.

DMA не использовал. Надо было писать CRC, все попытки задействовать аппаратный CRC SPI 407 с учётом того, что надо: послать какие-то команды - читать готовность - cбросить CRC - передать блок данных - записать CRC.. Не увенчались успехом. Я уже сути не помню, по-моему там CRC как то лихо автоматически сбрасывается, а команды и готовность с неизвестным числом обращений вычленить не удавалось.

Короче - от DMA пришлось отказаться.

Остальное всё работало. Были задействованы 2 страницы.

Когда чтение-модификация запись - то одна страница использовалась. Когда потоковая запись, то 2 страницы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Прочитайте другим рабочим программатором содержимое памяти.

2. Посмотрите логическим анализатором что у вас ходит по SPI.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сорян, надо было сразу ответить. В очередной раз невнимательность. Проблема была очень простая и банальная, я в ReadBuffer забыл DummyByte.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...