07.06.2018, 18:37
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
I2C на stm32f373 - ds1307 + at24c32
Добрый день. Использую заведомо рабочий код для чтения и записи в еепромку. На процах Ф0 работает. На 373 проце часы читаю без проблем, а еепромка постоянно читает 255. Сначала пишу в нужный адрес памяти потом пишу уже число. По анализатору всё уходит правильно. Два модуля ардуино проверил и одинаково не получается читать еепром. На 030 проце всё читается. Есть ли какие-то нюансы с I2C в 373 проце может кто знает??
|
|
|
|
07.06.2018, 18:47
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,705
Сказал спасибо: 189
Сказали Спасибо 3,194 раз(а) в 2,071 сообщении(ях)
|
Re: I2C на stm32f373 - ds1307 + at24c32
частота шины какая?
__________________
кагмаподэ магмаподэ
|
|
|
|
07.06.2018, 18:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: I2C на stm32f373 - ds1307 + at24c32
Сообщение от индюк
|
частота шины какая?
|
осликом смотрел - 380 кГц примерно. Я и на 100 и на 90 спускал. Часы работают, читаются а память чето нет... Брал запечатанную память для чтения и тоже самое...
|
|
|
|
07.06.2018, 18:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: I2C на stm32f373 - ds1307 + at24c32
Вот чтение и запись. EEPROM_OWN_ADDRESS 0x50
PHP код:
|
void eeprom_pagewrite(uint8_t address, uint8_t *buf,uint8_t nbytes)
{
uint8_t Count=0; // Счётчик успешно принятых байт
I2C2-›CR2 &= ~I2C_CR2_AUTOEND;
I2C2-›CR2 &= ~I2C_CR2_RD_WRN; // Режим передачи
I2C2-›CR2 &= ~I2C_CR2_NBYTES; // Очистить размер данных
I2C2-›CR2 |= ((nbytes+1)‹‹16); // Установить размер данных
I2C2-›CR2 &= ~I2C_CR2_SADD; // Очистить адрес ведомого устройства
I2C2-›CR2 |= (EEPROM_OWN_ADDRESS‹‹1); // Установить адрес ведомого устройства
I2C2-›CR2 |= I2C_CR2_START; // Выдать старт на шину
while ((I2C2-›ISR & I2C_ISR_BUSY)==0) {}; // Ожидать выдачу старта
// Сейчас либо I2C запросит первый байт для отправки,
// Либо взлетит NACK-флаг, говорящий о том, что микросхема не отвечает.
// Если взлетит NACK-флаг, отправку прекращаем.
while ((((I2C2-›ISR & I2C_ISR_TXIS)==0) && ((I2C2-›ISR & I2C_ISR_NACKF)==0)) && (I2C2-›ISR & I2C_ISR_BUSY)) {};
if (I2C2-›ISR & I2C_ISR_TXIS) I2C2-›TXDR=address; // Отправляю адрес регистра
// Отправляем байты до тех пор, пока не взлетит TC-флаг.
// Если взлетит NACK-флаг, отправку прекращаем.
while ((((I2C2-›ISR & I2C_ISR_TC)==0) && ((I2C2-›ISR & I2C_ISR_NACKF)==0)) && (I2C2-›ISR & I2C_ISR_BUSY))
{
if (I2C2-›ISR & I2C_ISR_TXIS) I2C2-›TXDR=*(buf++); // Отправляю данныеCount++
}
// //стоп
I2C2-›CR2 |= I2C_CR2_STOP; // Выдать стоп на шину
while (I2C1-›ISR & I2C_ISR_BUSY) {}; // Ожидать выдачу стопа
// Очищаю флаги - необходимо для дальнейшей работы шины
I2C2-›ICR |= I2C_ICR_STOPCF; // STOP флаг
I2C2-›ICR |= I2C_ICR_NACKCF; // NACK флаг
// Если есть ошибки на шине - очищаю флаги
if (I2C2-›ISR & (I2C_ISR_ARLO | I2C_ISR_BERR))
{
I2C2-›ICR |= I2C_ICR_ARLOCF;
I2C2-›ICR |= I2C_ICR_BERRCF;
}
}
void eeprom_pageread(uint8_t address,uint8_t *buf,uint8_t nbytes)
{
uint8_t Count=0; // Счётчик успешно принятых байт
I2C2-›CR2 &= ~I2C_CR2_AUTOEND; //авто-СТОП отключаем
I2C2-›CR2 &= ~I2C_CR2_RD_WRN; // Режим передачи
I2C2-›CR2 &= ~I2C_CR2_NBYTES; // Очистить размер данных
I2C2-›CR2 |= ((1)‹‹16); // Установить размер данных
I2C2-›CR2 &= ~I2C_CR2_SADD; // Очистить адрес ведомого устройства
I2C2-›CR2 |= (EEPROM_OWN_ADDRESS‹‹1); // Установить адрес ведомого устройства
I2C2-›CR2 |= I2C_CR2_START; // Выдать старт на шину
while ((I2C2-›ISR & I2C_ISR_BUSY)==0) {}; // Ожидать выдачу старта
// Сейчас либо I2C запросит первый байт для отправки,
// Либо взлетит NACK-флаг, говорящий о том, что микросхема не отвечает.
// Если взлетит NACK-флаг, отправку прекращаем.
while ((((I2C2-›ISR & I2C_ISR_TC)==0) && ((I2C2-›ISR & I2C_ISR_NACKF)==0)) && (I2C2-›ISR & I2C_ISR_BUSY))
{
if (I2C2-›ISR & I2C_ISR_TXIS) I2C2-›TXDR = address; // Отправляю адрес регистра
}
// Повторный старт
I2C2-›CR2 |= I2C_CR2_RD_WRN; // Режим приёма
I2C2-›CR2 &= ~I2C_CR2_NBYTES; // Очистить размер данных
I2C2-›CR2 |= ((nbytes)‹‹16); // Установить размер данных
I2C2-›CR2 &= ~I2C_CR2_SADD; // Очистить адрес ведомого устройства
I2C2-›CR2 |= (EEPROM_OWN_ADDRESS‹‹1); // Установить адрес ведомого устройства
I2C2-›CR2 |= I2C_CR2_START; // Выдать старт на шину
while ((I2C2-›ISR & I2C_ISR_BUSY)==0) {}; // Ожидать выдачу старта
// Принимаем байты до тех пор, пока не взлетит TC-флаг.
// Если взлетит NACK-флаг, приём прекращаем.
while ((((I2C2-›ISR & I2C_ISR_TC)==0) && ((I2C2-›ISR & I2C_ISR_NACKF)==0)) && (I2C2-›ISR & I2C_ISR_BUSY))
{
if (I2C2-›ISR & I2C_ISR_RXNE) *(buf++) = I2C2-›RXDR; // Принимаю данныеCount++
}
// //стоп
I2C2-›CR2 |= I2C_CR2_STOP; // Выдать стоп на шину
while (I2C2-›ISR & I2C_ISR_BUSY) {}; // Ожидать выдачу стопа
// Очищаю флаги - необходимо для дальнейшей работы шины
I2C2-›ICR |= I2C_ICR_STOPCF; // STOP флаг
I2C2-›ICR |= I2C_ICR_NACKCF; // NACK флаг
// Если есть ошибки на шине - очищаю флаги
if (I2C2-›ISR & (I2C_ISR_ARLO | I2C_ISR_BERR))
{
I2C2-›ICR |= I2C_ICR_ARLOCF;
I2C2-›ICR |= I2C_ICR_BERRCF;
}
}
|
|
|
|
|
07.06.2018, 19:07
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,705
Сказал спасибо: 189
Сказали Спасибо 3,194 раз(а) в 2,071 сообщении(ях)
|
Re: I2C на stm32f373 - ds1307 + at24c32
ох мать....
у меня запись умещается в 5 строк.
и чтение тоже
__________________
кагмаподэ магмаподэ
|
|
|
|
07.06.2018, 19:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: I2C на stm32f373 - ds1307 + at24c32
ну когда была только память то было чуток строк. Но когда стало ЛЭД-дисплей, часы и еепромка то оно всё глючило и пришлось всё вот так определять ))
|
|
|
|
08.06.2018, 12:44
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: I2C на stm32f373 - ds1307 + at24c32
я так понимаю что должно было всё работать? Придется на SPI видимо цеплять еепромку другую... Посоветуйте плиз какие можно использовать?
|
|
|
|
08.06.2018, 12:58
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: I2C на stm32f373 - ds1307 + at24c32
да залепи ты i2c на GPIO. Какая разница-то? Все равно ни DMA, ни прерывания не используются. Данные передаются короткими пакетами. Нет вообще никакого смысла городить все это на периферии.
|
|
|
|
08.06.2018, 16:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: I2C на stm32f373 - ds1307 + at24c32
Сообщение от Easyrider83
|
да залепи ты i2c на GPIO. Какая разница-то? Все равно ни DMA, ни прерывания не используются. Данные передаются короткими пакетами. Нет вообще никакого смысла городить все это на периферии.
|
Того же мнения,тут меня немного обругали за то что spi софтовно сделал http://mcu.goodboard.ru/viewtopic.php?id=139
http://mcu.goodboard.ru/viewtopic.php?id=143
Нафига вообще эта ds1307 , когда с ds3231 проблем вообще не знаю.
__________________
Глаза боятся,а руки делают.
|
|
|
|
08.06.2018, 17:36
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,637
Сказал спасибо: 117
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: I2C на stm32f373 - ds1307 + at24c32
Сообщение от CERGEI1982
|
тут меня немного обругали
|
И правильно, что обругали! Абдуринщики тусят на своем форуме и к людям не лезут!!!
Зачем делать софтово то, что есть аппаратно? Лень почитать RM с даташитом?
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:00.
|
|