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

 
 
 
Reply to this topicStart new topic
> STM32 и adesto AT45DB641E.
alexbbs
сообщение Jan 27 2017, 17:32
Сообщение #1





Группа: Участник
Сообщений: 6
Регистрация: 12-12-13
Пользователь №: 79 589



Привет, есть вопрос по этой памяти. Пытался писать в буфер и читать оттуда, пока не получается. На другой карточке не проверить.
Общаюсь с микросхемой успешно, информацию успешно читаю, как и отправляю. Читаю так:
Код
    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х месяцев.
Go to the top of the page
 
+Quote Post
alexbbs
сообщение Jan 28 2017, 15:12
Сообщение #2





Группа: Участник
Сообщений: 6
Регистрация: 12-12-13
Пользователь №: 79 589



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

Сообщение отредактировал alexbbs - Jan 28 2017, 15:12
Go to the top of the page
 
+Quote Post
alexbbs
сообщение Feb 8 2017, 01:11
Сообщение #3





Группа: Участник
Сообщений: 6
Регистрация: 12-12-13
Пользователь №: 79 589



Опять какой-то бред с памятью. Почему-то неправильно читает буфер, хотя пишет в буфер нормально. Как пример: обнуляем первую страницу, читаем непрерывным чтением командой 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 мбита.

Сообщение отредактировал AlexandrY - Feb 8 2017, 06:54
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 8 2017, 08:52
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Работал и работаю с этой памятью. Правда с 321.
DMA не использовал. Надо было писать CRC, все попытки задействовать аппаратный CRC SPI 407 с учётом того, что надо: послать какие-то команды - читать готовность - cбросить CRC - передать блок данных - записать CRC.. Не увенчались успехом. Я уже сути не помню, по-моему там CRC как то лихо автоматически сбрасывается, а команды и готовность с неизвестным числом обращений вычленить не удавалось.
Короче - от DMA пришлось отказаться.
Остальное всё работало. Были задействованы 2 страницы.
Когда чтение-модификация запись - то одна страница использовалась. Когда потоковая запись, то 2 страницы.
Go to the top of the page
 
+Quote Post
uriy
сообщение Feb 8 2017, 13:27
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



1. Прочитайте другим рабочим программатором содержимое памяти.
2. Посмотрите логическим анализатором что у вас ходит по SPI.
Go to the top of the page
 
+Quote Post
alexbbs
сообщение Feb 14 2017, 19:17
Сообщение #6





Группа: Участник
Сообщений: 6
Регистрация: 12-12-13
Пользователь №: 79 589



Сорян, надо было сразу ответить. В очередной раз невнимательность. Проблема была очень простая и банальная, я в ReadBuffer забыл DummyByte.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th August 2025 - 07:21
Рейтинг@Mail.ru


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