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

 
 
> 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
 
Start new topic
Ответов
alexbbs
сообщение Feb 8 2017, 01:11
Сообщение #2





Группа: Участник
Сообщений: 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



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

 


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


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