Интерфейсы периферийных устройств. Параллельный интерфейс ввода-вывода. Принципы построения параллельных портов ввода/вывода микроконтроллеров, страница 6

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

Флаг прерывания

  1. I2CADD (SFR адрес 55h) - регистр адреса I2C. Содержит адрес ПУ.
  2. I2CDAT (SFR адрес 9Ah) – регистр данных I2C. В него записываются данные при приёме и чтении, и передаче и записи.

Модуль с функциями 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; // конец синхроимпульса

}

SDATA

 
5) Посылка подтверждения устройству ACK()

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                 {...}