8-разрядный
Бит |
Название |
Описание |
7 |
MDO |
Бит выходных данных в режиме программный ведущий |
6 |
MDE |
Бит разрешения передачи данных 1 – передача, 0 – прием |
5 |
MCO |
Бит выходного синхроимпульса. Формируется напряжение на контакте SCL |
4 |
MDI |
Бит входных данных, считывается с SDA |
3 |
I2CM |
Выбор режима (ведущий или ведомый). 0 – аппаратный ведомый, 1 – программный ведущий |
2 |
I2CS |
Бит сброса 0 – нормальная работа, 1 – сброс импульса |
1 |
I2CTX |
Направление передачи 0 – прием, 1 – передача |
0 |
I2CI |
Флаг прерывания |
Модуль с функциями I2C
1) Delay() – задержка на 25 мкс.
void Delay(void)
{ char ch=0;
while(ch++<2);}
2) Посылка по I2C байта и ожидание подтверждения ACK.
На входе: ch – байт
На выходе: 0 – подтверждение
1 – нет подтверждения
bit SendByte (unsigned char ch)
{
char cnt;
bit ack;
MDE=1; // режим передачи данных
for(cnt=0;cnt<8;cnt++, cnt<<=1)
{
MDO=(ch&0x80)? 1:0; // выставляем или 1 или 0 в SDA; выделяем старший бит – если старший бит -1, то MDO=1, иначе 0
MCO=1;
Delay();
MCO=0; // формирование синхроимпульса
}
MDE=0; // режим приема
MCO=1; // 9й синхроимпульс
Delay();
ACK=MDI; // считывание бита с SDA
MCO=0; // конец синхроимпульса
return ACK; // вернуть значение бита ACK
}
3) Функция start()
void start(void)
{
MDE=1; // разрешить вывод
MDO=1; // SDATA=1
MCO=1; // начало синхроимпульса
Delay(); // задержка 25 мкс
MDO=0; // SDATA=0
Delay();
MCO=0; // конец синхроимпульса
}
4) Функция stop()
void stop()
{
MDE=1;
MDO=0;
MCO=1; // начало синхроимпульса
Delay();
MDO=1;
Delay();
MCO=0; // конец синхроимпульса
}
|
void ACK()
{
MDE=1;
MCO=0;
MDO=0;
MCO=1; // начало синхроимпульса
Delay();
MCO=0; // конец синхроимпульса
MDO=1;
}
6) Посылка неподтверждения Noack()
void Noack()
{
MDE=1;
MCO=0;
MDO=1;
Delay();
MCO=0;
}
7) Проверка на готовность slave устройства к обмену GetAck()
start + посылка адреса + получение отклика
8)Получение байта шины данных I2C
Результат – 8 бит данных
unsigned char RecvByte(void)
{
char cnt;
unsigned char ch=0;
MDE=0;
MCO=0;
for(cnt=0; cnt < 8; cnt++)
{
ch<<1;
MCO=1; // начало синхроимпульса
Delay();
ch=|MDI; // считывание байта с шины данных
MCO=0; // конец синхроимпульса
}
return ch;
}
4.3.6. Обмен информацией с микросхемой часов по интерфейсу I2C
Часы реального времени PCF8583
Между 1 и 2 ножками подключается кварцевый резонатор. Регистры выполняют роль счетчика, любой из этих регистров байтовый.
Эти часы позволяют работать в режиме таймера – не подключаем кварц, а запускаем импульсы, которые надо подсчитывать.
Доступ к регистрам осуществляется через I2C.
Циклы записи/чтения часов
Микроконтроллер передает данные в часы
Чтение данных из часов после установки адреса памяти
Программа чтения секунд
#include <ADuC812.h>
void Wsio(unsigned char ch)
{ TI=0;
SBUF=ch;
while(!TI);}
void init()
{ TH1=0XF0;
TMOD=0x20; // таймер 1 в режиме autoreload
SCON=0x50; // 8битовый UART
TCON=0x40; // запуск таймера 1}
// некоторые функции описаны ранее
void start() {...}
void stop() {...}
bit SendByte(unsigned ch) // передача байта {...}
void Noack() // нет ответа {...}
void ack() // ответ устройству slave {...}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.