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