03.01.2018, 20:18
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Указатели и EEPROM 24c16 + stm32
Здравствуйте. Помогите разобраться с указателями.
нужно переменную f1 записать в еепром 24с16. То как я применил казатели выглядит ужасно но работает. Подскажите как правильнее разложить флоат на 8 бит, записать в еепром, потом считать с еепром и снова восстановить флоат? Плиз....
мои функции
eeprom_pagewrite(uint16_t address, uint8_t *buf,uint8_t nbytes)
eeprom_pageread(uint16_t address,uint8_t* buf,uint8_t nbytes)
PHP код:
|
uint8_t temp1_eeprom[16], temp2_eeprom[16], temp3_eeprom[16], temp4_eeprom[8]; float test;//сюда пишем восстановленное число из епром
float f1 = 1.27; char *p,*pee ; p = (char*)&f1; // указатель на флоат который надо сохранить в память pee = (char*)&test; //указатель на восстановленный из еепром флоат
//тут пишем побайтно в массив temp2_eeprom temp2_eeprom[0] = p[0]; temp2_eeprom[1] = p[1]; temp2_eeprom[2] = p[2]; temp2_eeprom[3] = p[3];
// тут имитируем считывание с еепрома в массив temp1_eeprom temp1_eeprom[0] = temp2_eeprom[0]; temp1_eeprom[1] = temp2_eeprom[1]; temp1_eeprom[2] = temp2_eeprom[2]; temp1_eeprom[3] = temp2_eeprom[3];
//тут восстанавливаем число флоат после считывания из еепром pee[0] = temp1_eeprom[0]; pee[1] = temp1_eeprom[1]; pee[2] = temp1_eeprom[2]; pee[3] = temp1_eeprom[3];
//после этого выводим на дисплей и test = 1.27
|
Последний раз редактировалось miwutka; 03.01.2018 в 21:18.
|
|
|
|
03.01.2018, 21:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: Указатели и EEPROM 24c16 + stm32
если вот так прописать то в переменная test = 0. Массив temp1_eeprom заполнен правильно...
PHP код:
|
uint8_t temp1_eeprom[16], temp2_eeprom[16], temp3_eeprom[16], temp4_eeprom[8]; float test;//сюда пишем восстановленное число из епром
float f1 = 1.27; char *p,*pee ; p = (char*)&f1; // указатель на флоат который надо сохранить в память pee = (char*)&test; //указатель на восстановленный из еепром флоат
//тут пишем побайтно в массив temp2_eeprom // temp2_eeprom[0] = p[0]; // temp2_eeprom[1] = p[1]; // temp2_eeprom[2] = p[2]; // temp2_eeprom[3] = p[3];
eeprom_pagewrite(0, p,4);Delay_ms(10); eeprom_pageread(0, temp2_eeprom,5);// вместо 5 стояло 4 и test было равно 0
pee[0] = temp2_eeprom[0]; pee[1] = temp2_eeprom[1]; pee[2] = temp2_eeprom[2]; pee[3] = temp2_eeprom[3]; //после этого test = 1.27
|
Последний раз редактировалось miwutka; 03.01.2018 в 22:04.
|
|
|
|
03.01.2018, 23:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Указатели и EEPROM 24c16 + stm32
eeprom_pagewrite(0, (uint8_t*)(&f1), sizeof(f1));
eeprom_pageread(0, (uint8_t*)(&test), sizeof(test));
Если не работает, разбираться с тем, что наворочено в eeprom_pagewrite() и eeprom_pageread().
|
|
|
Сказали "Спасибо" AR_Favorit
|
|
|
04.01.2018, 00:21
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: Указатели и EEPROM 24c16 + stm32
AR_Favorit, да так красивее но ... запись как вы написали работает. Чтение не работает. Буду разбираться завтра... stm32f071
Если кто увидит раньше меня что не так подскажите плиз...
с указателями не дружу пока... чую что надо в последней строке чтото изменить... buf[index-1] = I2C1-›RXDR ;
PHP код:
|
void eeprom_pagewrite(uint16_t address, uint8_t *buf,uint8_t nbytes) { uint8_t index=0; I2C1-›CR2 = I2C_CR2_AUTOEND | ((2+nbytes)‹‹16) | (EEPROM_OWN_ADDRESS‹‹1); /* Check Tx empty */ //while (!(I2C1-›ISR & I2C_ISR_TXE) ); while ((!(I2C1-›ISR & I2C_ISR_TXE) ) && (Timeout == 0) ) { I2C_Timout++; if (I2C_Timout == ssd1306_I2C_TIMEOUT) {I2C_Timout = 0;Timeout = 1; } }; Timeout = 0; I2C_Timout = 0; I2C1-›TXDR =(uint8_t) (address››8); /* Byte to send */ I2C1-›CR2 |= I2C_CR2_START; /* Go */ while (!(I2C1-›ISR & I2C_ISR_TXIS) ); I2C1-›TXDR = (uint8_t)(address &0x00FF); /* Byte to send */ for(index=0;index‹=nbytes-1;index++) { while (!(I2C1-›ISR & I2C_ISR_TXIS) ); I2C1-›TXDR = buf[index] ; /* Byte to send */
} }
void eeprom_pageread(uint16_t address,uint8_t* buf,uint8_t nbytes) { uint8_t index=0; I2C1-›CR2 = (2‹‹16) | (EEPROM_OWN_ADDRESS‹‹1); while (!(I2C1-›ISR & I2C_ISR_TXE) ); I2C1-›TXDR = (uint8_t) (address››8); /* Byte to send */ I2C1-›CR2 |= I2C_CR2_START; /* Go */ while (!(I2C1-›ISR & I2C_ISR_TXIS) ); I2C1-›TXDR = (uint8_t)(address &0x00FF); /* Byte to send */ while (!(I2C1-›ISR & I2C_ISR_TC) ){}; I2C1-›CR2 = //I2C_CR2_AUTOEND | ((nbytes)‹‹16) | (EEPROM_OWN_ADDRESS‹‹1) | I2C_CR2_RD_WRN | I2C_CR2_NACK; I2C1-›CR2 |= I2C_CR2_START; /* Go */ for(index=0;index‹=nbytes-1;index++) { while (!(I2C1-›ISR & I2C_ISR_RXNE) ){}; buf[index-1] = I2C1-›RXDR ; } }
|
Последний раз редактировалось miwutka; 04.01.2018 в 00:27.
|
|
|
|
04.01.2018, 00:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Указатели и EEPROM 24c16 + stm32
Сообщение от miwutka
|
чую что надо в последней строке чтото изменить... buf[index-1] = I2C1-›RXDR ;
|
Правильно чуете. Первая итерация: uint8_t index = 0, buf[index-1] указывает на buf[255]
Убрать "-1", и будет больше похоже на правду.
ЗЫ и если уж о красоте - то выражение "index ‹ nbytes" тождественно "index‹=nbytes-1", но смотрится приятнее и помогает от ошибочно переданного нулевого nbytes.
Последний раз редактировалось AR_Favorit; 04.01.2018 в 01:02.
|
|
|
Сказали "Спасибо" AR_Favorit
|
|
|
04.01.2018, 03:00
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: Указатели и EEPROM 24c16 + stm32
Всё заработало. Осталась одна проблемка маленькая...
Чтобы считать 4 байта из еепромки надо писать eeprom_pageread(0, temp2_eeprom,5);
Надо исправить какую-то ошибку чтобы писать eeprom_pageread(0, temp2_eeprom,4);
Если я в строке buf[index-1] = I2C1-›RXDR ; убираю -1 то считывает на 5 байт, но первый байт в массиве равен нулю, а начиная со второго уже есть считанные 4 байта
То есть при 5-ке :
a[0] = 0;
a[1] = 10;
a[2] = 20;
a[3] = 30;
a[4] = 40;
Возможно ошибка в функции записи в епромку. Разбираюсь...
Вот сделал такие изменения в чтении с еромки
((nbytes+1)‹‹16) |
for(index=0;index‹nbytes+1;index++)
buf[index-1] = I2C1-›RXDR ;
Теперь как надо работает...
С указателями немного разобрался. Теперь надо научиться указатели для структуры данных использовать и для функций. Пошел учиться дальше )) Спасибо огромное за оперативную помощь!
Последний раз редактировалось miwutka; 04.01.2018 в 03:23.
|
|
|
|
04.01.2018, 03:25
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Указатели и EEPROM 24c16 + stm32
Сообщение от miwutka
|
убираю -1 то считывает на 5 байт, но первый байт в массиве равен нулю
|
А если не убираете, то этот первый считанный байт попадает куда-то в RAM и, возможно, что-то там портит. Так что убирать надо, и надо разбираться: этот байт, случаем, не записан на самом деле по нулевому адресу вместо первого байта того, что вы хотели записать?
Поменяйте стартовый адрес записи адрес в еепромке с "0" на, например, "3", и посмотрите еще раз, что пишется и что читается (с убранным "-1", разумеется).
Если первым байтом из считанных пяти по-прежнему будет "0", то ошибка в процедуре чтения. Если еще что-нибудь - значит, ошибка в процедуре записи.
|
|
|
|
04.01.2018, 03:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Указатели и EEPROM 24c16 + stm32
Последний раз редактировалось AR_Favorit; 04.01.2018 в 03:55.
|
|
|
|
04.01.2018, 16:38
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: Указатели и EEPROM 24c16 + stm32
Закралась какаято серьезная ошибка. Если писать не в нулевой адрес то микруха зависает..... Чтение с любого адреса читает только с первого. Буду разбираться с функциями..... вот фигня....
Чтение и запись по нулевому адресу всё четко работает. И флоат и инт и 8 бит всё четко считывает...
|
|
|
|
04.01.2018, 17:45
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Указатели и EEPROM 24c16 + stm32
Может быть ты упираешься в размер страницы? Не забывай, что указатель переходит на следующий байт только в пределах одной страницы. И потом надо ждать, пока информация запишется.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:04.
|
|