|
Чтение и запись во внешнюю память. |
|
|
|
Jun 25 2015, 05:43
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Это функции чтения/записи. Код void SPIEEPROM_WriteInt(uint32_t addr, uint32_t *ival) { SPIEEPROM_Write(addr,sizeof(uint32_t),(uint8_t*) ival); }
uint32_t SPIEEPROM_ReadInt(uint32_t addr) { uint32_t value; SPIEEPROM_Read(addr, sizeof(uint32_t), (uint8_t*)&value); return value; }
void SPIEEPROM_WriteFloat(uint32_t addr, float *fval) { SPIEEPROM_Write(addr,sizeof(float),(uint8_t*) fval); }
float SPIEEPROM_ReadFloat(uint32_t addr) { float value; SPIEEPROM_Read(addr, sizeof(float), (uint8_t*)&value); return value; } А так я тестирую. Код uint32_t adr; if(argument1 == NULL) UART_SendString(UART0,msg_misarg); else { adr = atoi(argument1); if(argument2 == NULL) //read operation { #ifdef SPI_INT uint32_t ival = SPIEEPROM_ReadInt(adr); UART_SendInt(UART0,ival); #endif #ifdef SPI_FLOAT float fval = SPIEEPROM_ReadFloat(adr); UART_SendFloat(UART0,fval,2); #endif } else //write operation { #ifdef SPI_INT uint32_t ival = atoi(argument2); SPIEEPROM_WriteInt(adr, &ival); #endif #ifdef SPI_FLOAT float fval = atof(argument2); SPIEEPROM_WriteFloat(adr, &fval); #endif } } float пишется-читается прекрасно. а вот с uint32_t непонятное явление - пишет (или читает?) неправильно. вот например запись - чтение 100 - 255 300 - 511 1000 - 1023 Сижу второй день над проблемой не могу понять где собака порылась.
Сообщение отредактировал Jenya7 - Jun 25 2015, 05:44
|
|
|
|
|
 |
Ответов
|
Jun 25 2015, 11:25
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Jun 25 2015, 11:40
|
Профессионал
    
Группа: Участник
Сообщений: 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 абсолютно одинаковы за исключением самой переменной.
|
|
|
|
Сообщений в этой теме
Jenya7 Чтение и запись во внешнюю память. Jun 25 2015, 05:43 mcheb Цитата(Jenya7 @ Jun 25 2015, 08:43) SPIEE... Jun 25 2015, 05:52 Jenya7 Цитата(mcheb @ Jun 25 2015, 11:52) А это ... Jun 25 2015, 06:26  mempfis_ Цитата(Jenya7 @ Jun 25 2015, 09:26) сдела... Jun 25 2015, 07:29   Jenya7 Цитата(mempfis_ @ Jun 25 2015, 13:29) Ник... Jun 25 2015, 07:41    mempfis_ Цитата(Jenya7 @ Jun 25 2015, 10:41) но fl... Jun 25 2015, 07:55     Jenya7 Цитата(mempfis_ @ Jun 25 2015, 13:55) ОК.... Jun 25 2015, 08:18      mempfis_ Цитата(Jenya7 @ Jun 25 2015, 11:18) я ста... Jun 25 2015, 08:29       Jenya7 Цитата(mempfis_ @ Jun 25 2015, 14:29) Мож... Jun 25 2015, 08:55        mempfis_ Цитата(Jenya7 @ Jun 25 2015, 11:55) IAR V... Jun 25 2015, 09:10         Jenya7 Цитата(mempfis_ @ Jun 25 2015, 15:10) По ... Jun 25 2015, 09:40          mempfis_ Цитата(Jenya7 @ Jun 25 2015, 12:40) я дум... Jun 25 2015, 10:11           Jenya7 Цитата(mempfis_ @ Jun 25 2015, 16:11) Пер... Jun 25 2015, 10:17            mempfis_ Цитатая смотрел и осциллографом и Logic Analizer ... Jun 25 2015, 10:32             Jenya7 Цитата(mempfis_ @ Jun 25 2015, 16:32) т.е... Jun 25 2015, 10:58              mempfis_ Цитата(Jenya7 @ Jun 25 2015, 13:58) пока ... Jun 25 2015, 11:13               Jenya7 Цитата(mempfis_ @ Jun 25 2015, 17:13) Мож... Jun 25 2015, 11:23 Jenya7 OMG!!!
нашел проблему. в SPIEEPROM_Rea... Jun 25 2015, 13:37 mempfis_ Цитата(Jenya7 @ Jun 25 2015, 16:37) OMG... Jun 25 2015, 13:42  Jenya7 Цитата(mempfis_ @ Jun 25 2015, 19:42)
М... Jun 25 2015, 14:05   mempfis_ Я во всех примерах работы с SPI всех мк с которыми... Jun 25 2015, 15:46    Jenya7 Цитата(mempfis_ @ Jun 25 2015, 21:46) Я в... Jun 25 2015, 16:30 Сергей Борщ Цитата(Jenya7 @ Jun 25 2015, 16:37) нашел... Jun 26 2015, 05:03  Jenya7 Цитата(Сергей Борщ @ Jun 26 2015, 11:03) ... Jun 28 2015, 05:26
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|