|
Запись в Serial EEprom. |
|
|
|
Apr 11 2016, 13:01
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Записывая в память нужно следить чтобы не перейти страницу. Код #define USE_STATUS_REG 0 //doesn't help any way
void LOGGER_PageWrite(uint32_t address, uint32_t length, uint8_t *buffer) { #if USE_STATUS_REG uint32_t timer; #endif volatile uint32_t page_limit=0; volatile uint32_t bytes_to_fit=0; volatile uint32_t bytes_to_write=0;
//find a page limit for the address while (address > page_limit) { page_limit += 64; } //actual page limit page_limit--;
bytes_to_fit = page_limit - address; bytes_to_write = bytes_to_fit;
// Note!!!Every write operation demands a write enable!!! SPI_CSlow(); SPI_SendByte(SPIEEPROM_CMD_WREN); SPI_CShigh();
// start write SPI_CSlow(); // send write command SPI_SendByte(SPIEEPROM_CMD_WRITE); // send address SPI_SendByte(address>>8); SPI_SendByte(address&0x00FF); while(bytes_to_write--) { // send data to be written SPI_SendByte(*buffer++); } // stop write SPI_CShigh();
#if USE_STATUS_REG timer = LOGGER_DELAY; //wait for write operation to complete while(SPIEEPROM_ReadStatus() & SPIEEPROM_STATUS_WIP) { if(!--timer) break; } #else //needs 5ms for page write Delay_us_sys(5000); #endif
if (bytes_to_fit <= length) { address += bytes_to_fit+1; bytes_to_write = length - bytes_to_fit;
// Note!!!Every write operation demands a write enable!!! SPI_CSlow(); SPI_SendByte(SPIEEPROM_CMD_WREN); SPI_CShigh();
// start write SPI_CSlow(); // send write command SPI_SendByte(SPIEEPROM_CMD_WRITE); // send address SPI_SendByte(address>>8); SPI_SendByte(address&0xFF); while(bytes_to_write--) { // send data to be written SPI_SendByte(*buffer++); } // stop write SPI_CShigh();
#if USE_STATUS_REG timer = LOGGER_DELAY; //wait for write operation to complete while(SPIEEPROM_ReadStatus() & SPIEEPROM_STATUS_WIP) { if(!--timer) break; } #else //needs 5ms for page write Delay_us_sys(5000); #endif } } проверяю. пишу по середине большое количество байт чтоб перейти на другую страницу. Код uint8_t rxbuffer[50]; for (int i=0; i < 50; i++) { rxbuffer[i] = i+1; } LOGGER_PageWrite(80, 50, rxbuffer); и потом считываю. Код uint8_t txbuffer[50]; LOGGER_Read(80, 50,txbuffer); результаты такие: в адрессе 80-127 я вижу данные 1-47 и это правильно в адрессе 128-130 я вижу /0, 48, 49 то есть первый адресс следующей страницы не прописывается. целый день бьюсь над проблемой не могу понять в чем дело.
|
|
|
|
|
 |
Ответов
|
Apr 12 2016, 08:16
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(aaarrr @ Apr 12 2016, 13:53)  Может, LOGGER_DELAY маловата? А зачем там вообще какая-то delay? Надо читать статус до тех пор пока не будет снят статус "занято". И делать это лучше не после, а перед операцией записи/стирания. Опять-же не выдерживается мин. время неактивности CS (ТС не читал даташит). Опять-же - не понятно как внутри устроена SPI_SendByte() у ТС, но очевидно что криво. Ибо, если она завершается сразу после записи байта данных в буферный регистр передатчика, то сразу после неё нельзя делать SPI_CShigh(); если же она завершается после опустошения сдвигового регистра передатчика, то это неоптимально (так как нет необходимости этого ждать внутри пакета байт команды).
|
|
|
|
|
Apr 12 2016, 08:59
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(aaarrr @ Apr 12 2016, 14:26)  Выход по тайм-ауту в таких случаях желательно все же иметь. Но при аварии надо ошибку вернуть, конечно, а не просто вывалиться. Да, а потом ещё не забыть сделать обработку этих возвращаемых статусов ошибок во всех точках вызова (что обычно обязательно забывают где-нить сделать). Или вернуть этот статус выше и там обработать. В любом случае с этой ошибкой (таймаут неготовности) надо что-то делать. А что делать? Ведь если превышен таймаут (который выставлен правильно в соответствии с даташитом), то значит микросхема не функционирует. Вы все характеристики всех элементов в схеме проверяете на их соответствие заявленным в даташите, или всё же предполагаете, что она должна функционировать как обещал производитель? Я обычно тоже делаю контроль таймаута в таких случаях, но при возникновении события таймаута (превышения времени заявленного в даташите) не возвращаю какой-то статус, а вызываю событие "критическая ошибка" (так как это явно отказ аппаратуры). Обработчик такого события или просто выполняет аппаратный сброс или например входит в состояние "критическая ошибка" с индикацией этого состояния (в режиме отладки). Цитата(Jenya7 @ Apr 12 2016, 14:27)  таймаут нужен чтоб не застрять навсегда в цикле. у меня все циклы имееют таймаут. Хорошо, вот наступил этот таймаут. Ваши действия? Что после этого делать-то?
|
|
|
|
Сообщений в этой теме
Jenya7 Запись в Serial EEprom. Apr 11 2016, 13:01 aaarrr Какой-то ужас, если честно.
Кодvoid eep_write... Apr 11 2016, 20:26 jcxz Цитата(aaarrr @ Apr 12 2016, 02:26) Какой... Apr 12 2016, 07:07 Jenya7 я извиняюсь немного непонятно это
Кодdata += a;
ad... Apr 12 2016, 07:03 aaarrr Цитата(Jenya7 @ Apr 12 2016, 10:03) я изв... Apr 12 2016, 07:09     Jenya7 Цитата(jcxz @ Apr 12 2016, 14:59) Да, а п... Apr 12 2016, 09:08      jcxz Цитата(Jenya7 @ Apr 12 2016, 15:05) это у... Apr 12 2016, 09:16       Jenya7 Цитата(jcxz @ Apr 12 2016, 15:16) Так а к... Apr 12 2016, 09:21 esaulenka ЦитатаСуд. Бракоразводный процесс. Судья спрашивае... Apr 12 2016, 08:05 Jenya7 таймаут нужен чтоб не застрять навсегда в цикле. у... Apr 12 2016, 08:27 aaarrr Цитата(Jenya7 @ Apr 12 2016, 11:27) тайма... Apr 12 2016, 08:39  Jenya7 Цитата(aaarrr @ Apr 12 2016, 14:39) Вот д... Apr 12 2016, 08:48   aaarrr Цитата(Jenya7 @ Apr 12 2016, 11:48) у мен... Apr 12 2016, 08:51    Jenya7 Цитата(aaarrr @ Apr 12 2016, 14:51) А смы... Apr 12 2016, 09:00     aaarrr Цитата(Jenya7 @ Apr 12 2016, 12:00) ничег... Apr 12 2016, 09:50      jcxz Цитата(aaarrr @ Apr 12 2016, 15:50) Взял ... Apr 12 2016, 09:59      Jenya7 Цитата(aaarrr @ Apr 12 2016, 15:50) Взял ... Apr 12 2016, 10:02       aaarrr Цитата(Jenya7 @ Apr 12 2016, 13:02) моя с... Apr 12 2016, 13:10       jcxz Цитата(Jenya7 @ Apr 12 2016, 16:02) получ... Apr 12 2016, 13:53   jcxz Цитата(Jenya7 @ Apr 12 2016, 14:48) но ес... Apr 12 2016, 09:03 Jenya7 чобы было легче дебагировать я немного переделал о... Apr 12 2016, 13:36 Jenya7 ввел задержку.
Кодbusy = 1;
//wait for write oper... Apr 12 2016, 14:18 aaarrr Цитата(Jenya7 @ Apr 12 2016, 17:18) что и... Apr 12 2016, 14:45 jcxz Цитата(Jenya7 @ Apr 12 2016, 20:18) ввел ... Apr 13 2016, 05:46  Jenya7 Цитата(jcxz @ Apr 13 2016, 11:46) Я Вам н... Apr 13 2016, 06:29   jcxz Цитата(Jenya7 @ Apr 13 2016, 12:29) бит 0... Apr 13 2016, 06:33    Jenya7 Цитата(jcxz @ Apr 13 2016, 12:33) Откройт... Apr 13 2016, 06:50     aaarrr Цитата(Jenya7 @ Apr 13 2016, 09:50) непон... Apr 13 2016, 16:41      jcxz Автор совершенно не желает читать даташит..... Apr 13 2016, 17:01
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|