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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Чтение и запись во внешнюю память.
mempfis_
сообщение Jun 25 2015, 11:13
Сообщение #16


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

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(Jenya7 @ Jun 25 2015, 13:58) *
пока проблему решил так - просто делаю кастинг с float на uint32_t но это конечно ужасно.


Может быть проблемы с atoi(argument1/2); ?
Вы не пробовали отправлять в эхо команд и результаты работы функций atoi/atof?
Что если не использовать аргументы а просто записывать по фиксированным адресам фиксированные данные.
Или завести static int adr, value и инкрементиоровать их с каждой командой на запись.

Мне приходилось работать как минимум с 2мя производителями памяти на 3х разных архитектурах процессоров. Были программные проблемы, но проблем с памятью никогда не было при выдерживании корректной процедуры записи.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 25 2015, 11:23
Сообщение #17


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

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



Цитата(mempfis_ @ Jun 25 2015, 17:13) *
Может быть проблемы с atoi(argument1/2); ?
Вы не пробовали отправлять в эхо команд и результаты работы функций atoi/atof?
Что если не использовать аргументы а просто записывать по фиксированным адресам фиксированные данные.
Или завести static int adr, value и инкрементиоровать их с каждой командой на запись.

Мне приходилось работать как минимум с 2мя производителями памяти на 3х разных архитектурах процессоров. Были программные проблемы, но проблем с памятью никогда не было при выдерживании корректной процедуры записи.


попробовал прописать напрямую адрес и дату. та же проблема. это что то в IAR.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 25 2015, 11:25
Сообщение #18


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



В функциях из первого сообщения ошибок нет. Как вы понимаете, число с плавающей точкой занимает те же 4 байта, что и 32-битное целое. Поэтому компилятор должен был сгенерить идентичный код для SPIEEPROM_WriteInt() и SPIEEPROM_WriteFloat(), а также для пары функций чтения. Я бы на вашем месте для начала проверил корректность работы функции UART_SendInt() примерно так:
Код
    else  //write operation
    {                    
        #ifdef SPI_INT
         uint32_t ival = atoi(argument2);
      UART_SendInt(UART0,ival);   // <------------------
        SPIEEPROM_WriteInt(adr, &ival);
Отладчик в точке останова может и не показать правильное значение переменной (если эта переменная на момент останова еще находится в регистре, например). Тут надо очень внимательно смотреть дизассемблированный код, чтобы понять - где именно на данной команде находится значение переменной.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 25 2015, 11:40
Сообщение #19


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

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



Цитата(Сергей Борщ @ Jun 25 2015, 17:25) *
В функциях из первого сообщения ошибок нет. Как вы понимаете, число с плавающей точкой занимает те же 4 байта, что и 32-битное целое. Поэтому компилятор должен был сгенерить идентичный код для SPIEEPROM_WriteInt() и SPIEEPROM_WriteFloat(), а также для пары функций чтения. Я бы на вашем месте для начала проверил корректность работы функции UART_SendInt() примерно так:
Код
    else  //write operation
    {                    
        #ifdef SPI_INT
         uint32_t ival = atoi(argument2);
      UART_SendInt(UART0,ival);   // <------------------
        SPIEEPROM_WriteInt(adr, &ival);
Отладчик в точке останова может и не показать правильное значение переменной (если эта переменная на момент останова еще находится в регистре, например). Тут надо очень внимательно смотреть дизассемблированный код, чтобы понять - где именно на данной команде находится значение переменной.


Сергей сделал как вы советовали. Вижу в терминале правильное значение. В том то и весь маразм - функции для float и uint32_t абсолютно одинаковы за исключением самой переменной.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 25 2015, 13:37
Сообщение #20


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

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



OMG!!!
нашел проблему. в SPIEEPROM_Read() заменил все SPI_SendByte на SPI_TransferByte().
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Jun 25 2015, 13:42
Сообщение #21


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

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(Jenya7 @ Jun 25 2015, 16:37) *
OMG!!!
нашел проблему. в SPIEEPROM_Read() заменил все SPI_SendByte на SPI_TransferByte().

1111493779.gif
Мои поздравления.

Приведите тогда уж код обеих функций - посмотрим чем они отличаются. И почему с одной не работает, а со второй работает.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 25 2015, 14:05
Сообщение #22


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

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



Цитата(mempfis_ @ Jun 25 2015, 19:42) *
1111493779.gif
Мои поздравления.

Приведите тогда уж код обеих функций - посмотрим чем они отличаются. И почему с одной не работает, а со второй работает.


Код
void SPI_SendByte(USART_TypeDef  *usart,uint8_t sendbyte)
{
    /* Check that transmit buffer is empty */
    while (!(usart->STATUS & USART_STATUS_TXBL));

    usart->TXDATA = (uint32_t)sendbyte;

    /* Wait for transmitting to finished */
  while (!(usart->STATUS & USART_STATUS_TXC));
}


uint32_t SPI_TransferByte(USART_TypeDef *usart,uint32_t sendbyte)
{
   /* Check that transmit buffer is empty */
  while (!(usart->STATUS & USART_STATUS_TXBL));

  usart->TXDATA = (uint32_t)sendbyte;

  /* Wait for transmitting to finished */
  while (!(usart->STATUS & USART_STATUS_TXC));

  //return data;
    return majority32const(&usart->RXDATA);

}


Сообщение отредактировал Jenya7 - Jun 25 2015, 14:08
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Jun 25 2015, 15:46
Сообщение #23


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

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Я во всех примерах работы с SPI всех мк с которыми работал видел чтение регистра данных после завершения передачи. Даже если результат нафиг не нужен. С STM32 работал но Hard SPI пока не использовал. Буду знать что принцип работы с ним схож с другими мк.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 25 2015, 16:30
Сообщение #24


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

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



Цитата(mempfis_ @ Jun 25 2015, 21:46) *
Я во всех примерах работы с SPI всех мк с которыми работал видел чтение регистра данных после завершения передачи. Даже если результат нафиг не нужен. С STM32 работал но Hard SPI пока не использовал. Буду знать что принцип работы с ним схож с другими мк.

Но что интересно float читался правильно. Наверно надо очищать приемный буфер в любом случае, иначе что то там глючит.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 26 2015, 05:03
Сообщение #25


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Jenya7 @ Jun 25 2015, 16:37) *
нашел проблему. в SPIEEPROM_Read() заменил все SPI_SendByte на SPI_TransferByte().
Есть некоторые сомнения. Либо у вас там теперь четное количество ошибок. Мы же согласились, что и для целого, и для числа с плавающей точкой SPIEEPROM_Read() и SPIEEPROM_Write() вызываются с идентичными параметрами. Если бы проблема была (только) внутри функции чтения, то она проявлялась бы и для целого, и для числа с плавающей точкой. Я еще в предыдущем сообщении хотел предложить вам попробовать записать/прочитать с помощью SPIEEPROM_Write()/SPIEEPROM_Read() массив из 10-20 байтов - на нем ошибка была бы виднее.

Кстати, а что делает последний параметр в функции UART_SendFloat(UART0,fval,2)? Уж не количество ли знаков после запятой он указывает? Тогда вполне вероятно, что ошибку чтения в самом младшем байте вы могли просто не увидеть, потому что эти биты просто не попадают на экран.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 28 2015, 05:26
Сообщение #26


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

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



Цитата(Сергей Борщ @ Jun 26 2015, 11:03) *
Есть некоторые сомнения. Либо у вас там теперь четное количество ошибок. Мы же согласились, что и для целого, и для числа с плавающей точкой SPIEEPROM_Read() и SPIEEPROM_Write() вызываются с идентичными параметрами. Если бы проблема была (только) внутри функции чтения, то она проявлялась бы и для целого, и для числа с плавающей точкой. Я еще в предыдущем сообщении хотел предложить вам попробовать записать/прочитать с помощью SPIEEPROM_Write()/SPIEEPROM_Read() массив из 10-20 байтов - на нем ошибка была бы виднее.

Кстати, а что делает последний параметр в функции UART_SendFloat(UART0,fval,2)? Уж не количество ли знаков после запятой он указывает? Тогда вполне вероятно, что ошибку чтения в самом младшем байте вы могли просто не увидеть, потому что эти биты просто не попадают на экран.

Сергей вы как всегда правы. Третий параметр это количество знаков после запятой. Поэтому мы не видели ошибку.
Go to the top of the page
 
+Quote Post

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

 


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


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