Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 и adesto AT45DB641E.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
alexbbs
Привет, есть вопрос по этой памяти. Пытался писать в буфер и читать оттуда, пока не получается. На другой карточке не проверить.
Общаюсь с микросхемой успешно, информацию успешно читаю, как и отправляю. Читаю так:
Код
    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
Ошибку понял, байт прочитал задом наперед.
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
Ö=À¦ÂÉr xSÊÌ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 мбита.
SasaVitebsk
Работал и работаю с этой памятью. Правда с 321.
DMA не использовал. Надо было писать CRC, все попытки задействовать аппаратный CRC SPI 407 с учётом того, что надо: послать какие-то команды - читать готовность - cбросить CRC - передать блок данных - записать CRC.. Не увенчались успехом. Я уже сути не помню, по-моему там CRC как то лихо автоматически сбрасывается, а команды и готовность с неизвестным числом обращений вычленить не удавалось.
Короче - от DMA пришлось отказаться.
Остальное всё работало. Были задействованы 2 страницы.
Когда чтение-модификация запись - то одна страница использовалась. Когда потоковая запись, то 2 страницы.
uriy
1. Прочитайте другим рабочим программатором содержимое памяти.
2. Посмотрите логическим анализатором что у вас ходит по SPI.
alexbbs
Сорян, надо было сразу ответить. В очередной раз невнимательность. Проблема была очень простая и банальная, я в ReadBuffer забыл DummyByte.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.