|
Запись в 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:27
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
таймаут нужен чтоб не застрять навсегда в цикле. у меня все циклы имееют таймаут. функции такие Код // commands #define SPIEEPROM_CMD_READ 0x03 // Read byte(s) #define SPIEEPROM_CMD_WRITE 0x02 // Write byte(s) #define SPIEEPROM_CMD_WREN 0x06 // Write Enable #define SPIEEPROM_CMD_WRDI 0x04 // Write Disable #define SPIEEPROM_CMD_RDSR 0x05 // Read Status Register #define SPIEEPROM_CMD_WRSR 0x01 // Write Status Register
// status register bit defines #define SPIEEPROM_STATUS_WIP 0x01 // Write in progress #define SPIEEPROM_STATUS_WEL 0x02 // Write enable #define SPIEEPROM_STATUS_BP0 0x04 // Block Protection 0 #define SPIEEPROM_STATUS_BP1 0x08 // Block Protection 1 #define SPIEEPROM_STATUS_WPEN 0x80 // Write Protect Enable
uint32_t SPI_TransferByte(uint32_t sendbyte) { uint32_t timeout = SPI_DELAY; /* Check that transmit buffer is empty */ while (!(SPI_USART->STATUS & USART_STATUS_TXBL)) { if(!--timeout) break; } SPI_USART->TXDATA = (uint32_t)sendbyte; /* Wait for transmitting to finished */ timeout = SPI_DELAY; while (!(SPI_USART->STATUS & USART_STATUS_TXC)) { if(!--timeout) break; } //return data; return majority32const(&SPI_USART->RXDATA); }
void SPI_SendByte(uint8_t sendbyte) { uint32_t timeout = SPI_DELAY;
USART_Tx(SPI_USART,sendbyte);
/* Wait for transmitting to finished */ while (!(SPI_USART->STATUS & USART_STATUS_TXC)) { if(!--timeout) break; } }
uint8_t SPIEEPROM_ReadStatus(void) { uint8_t status; SPI_CSlow(); // send read status register command SPI_SendByte(SPIEEPROM_CMD_RDSR); // get status register value status = SPI_TransferByte(0xFF); SPI_CShigh(); return status; } память CAT25256
Сообщение отредактировал Jenya7 - Apr 12 2016, 08:33
|
|
|
|
Сообщений в этой теме
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 большое спасибо так работает.
причем тестироват... Apr 12 2016, 07:25 aaarrr Цитата(Jenya7 @ Apr 12 2016, 10:25) нужно... Apr 12 2016, 07:53  jcxz Цитата(aaarrr @ Apr 12 2016, 13:53) Может... Apr 12 2016, 08:16   aaarrr Цитата(jcxz @ Apr 12 2016, 11:16) А зачем... Apr 12 2016, 08:26    jcxz Цитата(aaarrr @ Apr 12 2016, 14:26) Выход... Apr 12 2016, 08:59     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   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 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
|
|
|