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

 
 
> AVR Studio 5 + avrlib + DS1307, Проблемы с I2C интерфейсом
Дима 128
сообщение Sep 21 2011, 13:02
Сообщение #1





Группа: Участник
Сообщений: 11
Регистрация: 21-09-11
Пользователь №: 67 312



Друзья подскажите как обмениваться данными с часами DS1307 через функции avrlib Раньше писал с CodeVision там программный I2C и библиотека под часы была но пришлось перейти на AVR Studio так как библиотеки avrlib есть графический дисплей вот что то пытался написать но не работает не пойму как пользоваться I2C Библиотекой в итоге этого исходника ничего не происходит хотя импульсы на выходе контроллера есть (mega128) FCpu=8мгц В переменных нули =(((



i2cSetBitrate(50);
i2cInit();


while(1)
{


i2cSendStart();
_delay_ms(100);
i2cSendByte(0xd0);
_delay_ms(100);
i2cSendByte(0);
_delay_ms(100);
i2cSendStart();
_delay_ms(100);
i2cSendByte(0xd1);
_delay_ms(100);
sek= i2cGetReceivedByte();
min= i2cGetReceivedByte();
hour= i2cGetReceivedByte();


i2cSendStop();
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
paskal
сообщение Sep 23 2011, 16:55
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Цитата(Дима 128 @ Sep 21 2011, 17:02) *
i2cSendStart();
_delay_ms(100);
i2cSendByte(0xd0);
_delay_ms(100);
i2cSendByte(0);
_delay_ms(100);
i2cSendStart();
_delay_ms(100);
i2cSendByte(0xd1);
_delay_ms(100);
sek= i2cGetReceivedByte();
min= i2cGetReceivedByte();
hour= i2cGetReceivedByte();


i2cSendStop();


А вы пробовали проверить значение ACK бита которое отдает вам DS1307? Это дало бы какую то информацию. И неплохо знать что какой ACK вы отдаете при чтении.
Еще вот что я думаю. После передачи D0, 00 вы передаете сразу старт условие. А может стоило бы сначала стоп передать?

Go to the top of the page
 
+Quote Post
Дима 128
сообщение Sep 23 2011, 18:30
Сообщение #3





Группа: Участник
Сообщений: 11
Регистрация: 21-09-11
Пользователь №: 67 312



Вы про бит чтения.запись? Там получается что у устройства адрес 1101000 семи разрядный + бит этот получается 11010000=0xd0 Я на основе примера из CodeVisin пытался сделать там часы работают

i2c_start();
i2c_write(0xd0);
i2c_write(0);
i2c_start();
i2c_write(0xd1);
*sec=bcd2bin(i2c_read(1));
*min=bcd2bin(i2c_read(1));
*hour=bcd2bin(i2c_read(0));
i2c_stop();


А вот как это с функциями из avrlib это проделать не знаю что то упускаю пробовал вот так


i2cSetBitrate(100);
i2cInit();


i2cSendStart();

i2cSendByte(0xD0);

i2cSendByte(0);

i2cSendStop();

i2cSendStart();

i2cSendByte(0xD1);

sek=i2cGetReceivedByte();

i2cSendStop();


Но где то ошибка есть =(((



Вот функции которые есть в avrlib

// functions

//! Initialize I2C (TWI) interface
void i2cInit(void);

//! Set the I2C transaction bitrate (in KHz)
void i2cSetBitrate(u16 bitrateKHz);

// I2C setup and configurations commands
//! Set the local (AVR processor's) I2C device address
void i2cSetLocalDeviceAddr(u08 deviceAddr, u08 genCallEn);

//! Set the user function which handles receiving (incoming) data as a slave
void i2cSetSlaveReceiveHandler(void (*i2cSlaveRx_func)(u08 receiveDataLength, u08* recieveData));
//! Set the user function which handles transmitting (outgoing) data as a slave
void i2cSetSlaveTransmitHandler(u08 (*i2cSlaveTx_func)(u08 transmitDataLengthMax, u08* transmitData));

// Low-level I2C transaction commands
//! Send an I2C start condition in Master mode
void i2cSendStart(void);
//! Send an I2C stop condition in Master mode
void i2cSendStop(void);
//! Wait for current I2C operation to complete
void i2cWaitForComplete(void);
//! Send an (address|R/W) combination or a data byte over I2C
void i2cSendByte(u08 data);
//! Receive a data byte over I2C
// ackFlag = TRUE if recevied data should be ACK'ed
// ackFlag = FALSE if recevied data should be NACK'ed
void i2cReceiveByte(u08 ackFlag);
//! Pick up the data that was received with i2cReceiveByte()
u08 i2cGetReceivedByte(void);
//! Get current I2c bus status from TWSR
u08 i2cGetStatus(void);

// high-level I2C transaction commands

//! send I2C data to a device on the bus
void i2cMasterSend(u08 deviceAddr, u08 length, u08 *data);
//! receive I2C data from a device on the bus
void i2cMasterReceive(u08 deviceAddr, u08 length, u08* data);

//! send I2C data to a device on the bus (non-interrupt based)
u08 i2cMasterSendNI(u08 deviceAddr, u08 length, u08* data);
//! receive I2C data from a device on the bus (non-interrupt based)
u08 i2cMasterReceiveNI(u08 deviceAddr, u08 length, u08 *data);

//! Get the current high-level state of the I2C interface
eI2cStateType i2cGetState(void);

#endif
Go to the top of the page
 
+Quote Post
paskal
сообщение Sep 23 2011, 18:37
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Цитата(Дима 128 @ Sep 23 2011, 21:59) *
Вы про бит чтения.запись? Там получается что у устройства адрес 1101000 семи разрядный + бит этот получается 11010000=0xd0

Нет, я про бит ACK, который идет после бита чтение-запись. Он 9-й по счету. Вам надо читать стандарт I2C, там это написано. И в ваших исходниках реализация этого бита не видна. Может даже ваш контроллер не формирует такт для него из за чего сбивается весь протокол.
Go to the top of the page
 
+Quote Post
Дима 128
сообщение Sep 23 2011, 18:47
Сообщение #5





Группа: Участник
Сообщений: 11
Регистрация: 21-09-11
Пользователь №: 67 312



Как же реализовать это в этих функциях? Я думал там это уже все есть =)))
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Дима 128   AVR Studio 5 + avrlib + DS1307   Sep 21 2011, 13:02
- - haker_fox   QUOTE (Дима 128 @ Sep 21 2011, 22:02) Дру...   Sep 22 2011, 03:07
|- - Дима 128   По теме: Вам следует почиать стандарт на шину I2C....   Sep 22 2011, 04:16
|- - haker_fox   QUOTE (Дима 128 @ Sep 22 2011, 13:16) Ну ...   Sep 22 2011, 09:32
|- - Дима 128   Так вот и я запускал не одни часы =))) Но в CodeVi...   Sep 22 2011, 15:48
|- - Дима 128   Пробовал вот так rs&=3; if (sqwe) rs|=0x10; if...   Sep 22 2011, 18:01
|- - haker_fox   QUOTE (Дима 128 @ Sep 23 2011, 00:48) Так...   Sep 23 2011, 08:02
|- - Дима 128   Ну не писать же библиотеку I2C С нуля если она там...   Sep 23 2011, 08:07
|- - haker_fox   QUOTE (Дима 128 @ Sep 23 2011, 17:07) Ну ...   Sep 23 2011, 11:47
|- - Дима 128   Да я на ассемблере запускал его соответственно зна...   Sep 23 2011, 14:59
- - paskal   Поэтому надо писать свои функции. Для I2C это не с...   Sep 24 2011, 06:33
- - Дима 128   Да наверно придется что то самому придумать =(((   Sep 24 2011, 06:52
- - Дима 128   RE: AVR Studio 5 + avrlib + DS1307   Sep 25 2011, 16:27


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

 


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


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