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

 
 
> Запись в Serial EEprom.
Jenya7
сообщение Apr 11 2016, 13:01
Сообщение #1


Профессионал
*****

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

то есть первый адресс следующей страницы не прописывается. целый день бьюсь над проблемой не могу понять в чем дело.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Jenya7
сообщение Apr 12 2016, 08:27
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 12 2016, 08:39
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Jenya7 @ Apr 12 2016, 11:27) *
таймаут нужен чтоб не застрять навсегда в цикле. у меня все циклы имееют таймаут.

Вот для циклов, работающих с внутренней простой периферией типа SPI, тайм-ауты как раз излишни.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Apr 12 2016, 08:48
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(aaarrr @ Apr 12 2016, 14:39) *
Вот для циклов, работающих с внутренней простой периферией типа SPI, тайм-ауты как раз излишни.

у меня SPI не тактируется постоянно. включил клок - переслал - выключил. кроме того на том же SPI кроме памяти сидит еще один модуль. кроме того куча прерываний. я не могу предвидеть все ситуации. но если возникнет ситуация обращения к SPI при выключенном клоке - без таймаута я зависну намертво.

только не говорите мне про атомарное обращение. не везде это приемлимо.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 12 2016, 09:03
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Apr 12 2016, 14:48) *
но если возникнет ситуация обращения к SPI при выключенном клоке - без таймаута я зависну намертво.

А как такое может быть - "обращения к SPI при выключенном клоке"??? Ведь этим клоком должен управлять этот-же код, который управляет обменом по SPI. Значит он сам его и выключил?
Если так - то это ошибка в коде, её надо искать и исправлять, а не ваять костыли всякие типа таймаутов, которые её "замажут" в некоторых случаях и приведут к непредсказуемому поведению ПО.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


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

 


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


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