|
Чтение и запись во внешнюю память. |
|
|
|
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, 05:52
|
Местный
  
Группа: Участник
Сообщений: 326
Регистрация: 30-05-06
Пользователь №: 17 602

|
Цитата(Jenya7 @ Jun 25 2015, 08:43)  SPIEEPROM_Write(addr,sizeof(uint32_t),(uint8_t*) ival); А это что за чудо?
|
|
|
|
|
Jun 25 2015, 06:26
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(mcheb @ Jun 25 2015, 11:52)  А это что за чудо? сделал так SPIEEPROM_Write(addr, 4, (uint8_t*) ival); не помогло
|
|
|
|
|
Jun 25 2015, 08:55
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(mempfis_ @ Jun 25 2015, 14:29)  Может для ускорения решения проблемы приведёте код базовых функций чтения/записи из/в eeprom, функций отправки int/float в uart, назовёте тип eeprom и конкретные адреса по которым происходит запись/чтение? Без этих данных мало чем можно помочь. Ещё можно указать что за IAR и проверить размер стека программы. это функции Код void SPIEEPROM_Write(uint32_t address, uint32_t lenght, uint8_t *buffer) { // Note!!!Every write operation demands a write enable!!! SPI2_CSlow(); SPI_SendByte(USART2,SPIEEPROM_CMD_WREN); SPI2_CShigh();
// start write SPI2_CSlow(); // send write command SPI_SendByte(USART2,SPIEEPROM_CMD_WRITE); // send address SPI_SendByte(USART2,address>>8); SPI_SendByte(USART2,address&0x00FF); while(lenght--) { // send data to be written SPI_SendByte(USART2,*buffer++); } // stop write SPI2_CShigh(); }
void SPIEEPROM_Read(uint32_t address, uint32_t lenght, uint8_t *buffer) { if(lenght>PAGE_SIZE) return; uint32_t data; // start read SPI2_CSlow(); // send command SPI_SendByte(USART2,SPIEEPROM_CMD_READ); // send address SPI_SendByte(USART2,address>>8); SPI_SendByte(USART2,address&0x00FF); // read contents of memory address while(lenght--) { data = SPI_TransferByte(USART2,0x00); *buffer++ = data; } // stop read SPI2_CShigh(); } IAR V7.2. size_cstack__ = 0x400; память CAT25256 вопрос почему float пишется-читается правильно а uint32_t нет.
Сообщение отредактировал Jenya7 - Jun 25 2015, 08:52
|
|
|
|
|
Jun 25 2015, 09:40
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(mempfis_ @ Jun 25 2015, 15:10)  По структуре функций - при чтении похоже всё нормально. А вот при записи не хватает ожидания завершения записи - контроля бита 0 (маска 0x01 в статус-регистре) сразу после SPI2_CShigh();. Любое обращение к памяти во время записи может сбить запись. Также я не увидел контроля пересечения границы страницы при записи данных. Если Вы вдруг захотите записать 4 байта начиная с адреса скажем 61 (мене чем за 4 байта до границы страницы) то получите сюрприз при чтении. SPI_SendByte(USART2,SPIEEPROM_CMD_READ); отправляет байт в SPI и паралельно в UART? SPI_TransferByte(USART2,0x00); - читает байт из SPI и паралельно отправляет байт в UART? спасибо за замечания. исправлю. однако это не объясняет проблему. я думал что для этой памяти не важно пересечение границы страницы. но я писал в разные адреса 10, 20,100. я пишу-читаю с терминала, после записи проходит достаточно времени. у меня USART2 настроен как SPI.
|
|
|
|
Сообщений в этой теме
Jenya7 Чтение и запись во внешнюю память. Jun 25 2015, 05:43          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 Сергей Борщ В функциях из первого сообщения ошибок нет. Как вы... Jun 25 2015, 11:25 Jenya7 Цитата(Сергей Борщ @ Jun 25 2015, 17:25) ... Jun 25 2015, 11:40 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
|
|
|