alexbbs 0 27 января, 2017 Опубликовано 27 января, 2017 · Жалоба Привет, есть вопрос по этой памяти. Пытался писать в буфер и читать оттуда, пока не получается. На другой карточке не проверить. Общаюсь с микросхемой успешно, информацию успешно читаю, как и отправляю. Читаю так: 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 0 28 января, 2017 Опубликовано 28 января, 2017 (изменено) · Жалоба Ошибку понял, байт прочитал задом наперед. Изменено 28 января, 2017 пользователем alexbbs Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexbbs 0 8 февраля, 2017 Опубликовано 8 февраля, 2017 (изменено) · Жалоба Опять какой-то бред с памятью. Почему-то неправильно читает буфер, хотя пишет в буфер нормально. Как пример: обнуляем первую страницу, читаем непрерывным чтением командой 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 мбита. Изменено 8 февраля, 2017 пользователем AlexandrY Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 8 февраля, 2017 Опубликовано 8 февраля, 2017 · Жалоба Работал и работаю с этой памятью. Правда с 321. DMA не использовал. Надо было писать CRC, все попытки задействовать аппаратный CRC SPI 407 с учётом того, что надо: послать какие-то команды - читать готовность - cбросить CRC - передать блок данных - записать CRC.. Не увенчались успехом. Я уже сути не помню, по-моему там CRC как то лихо автоматически сбрасывается, а команды и готовность с неизвестным числом обращений вычленить не удавалось. Короче - от DMA пришлось отказаться. Остальное всё работало. Были задействованы 2 страницы. Когда чтение-модификация запись - то одна страница использовалась. Когда потоковая запись, то 2 страницы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 4 8 февраля, 2017 Опубликовано 8 февраля, 2017 · Жалоба 1. Прочитайте другим рабочим программатором содержимое памяти. 2. Посмотрите логическим анализатором что у вас ходит по SPI. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexbbs 0 14 февраля, 2017 Опубликовано 14 февраля, 2017 · Жалоба Сорян, надо было сразу ответить. В очередной раз невнимательность. Проблема была очень простая и банальная, я в ReadBuffer забыл DummyByte. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться