Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МПС_проект2007.doc
Скачиваний:
88
Добавлен:
12.04.2015
Размер:
2.02 Mб
Скачать
      1. Сопряжение с памятью по интерфейсу i2c

На рис.5.16 показано подключение микросхемы ЕЕРROM АТ24С02 к микроконтроллеру.

Рис.5.16. Подключение последовательной Flash-памяти и датчика температуры к микроконтроллеру

Данная микросхема имеет последовательный интерфейс I2C. Выводы SCL (синхроимпульсы) и SDA (последовательные данные) обеспечивают синхронную передачу, тип выхода – открытый коллектор. Резисторы R1 и R2 являются нагрузочными, хотя они могут быть опущены за счет использования внутренних подтягивающих резисторов микроконтроллера (в этом случае фронты будут более пологими и, как следствие, меньшая возможная скорость передачи по линии).

Организация микросхемы 256 х 8 бит.

Обращение к микросхеме происходит посредством передачи по шине I2C slave-адреса, как показано на рис.5.17. Адрес состоит из 7 битов. Старшие 4 бита (1010) определяют принадлежность микросхемы к группе EEPROM, младшие 3 бита – А0, А1, А2 – задают уникальный идентификационный номер в группе однотипных микросхем. Младший бит – R/W –признак чтения/записи (= 1 – чтение, = 0 – запись).

1

0

1

0

А2

А1

А0

R/W

Рис.5.17. Построение slave-адреса

S

slave-адрес, R/W=0

ACK

адрес ячейки

АСК

S

slave-адрес, R/W=1

АСК

байт дан-

ных

АСК

Послед.

байт

данных

1

Р

Рис.5.18. Чтение из памяти

В нашем случае А2=А1=А0=0 (см. рис.5.16), поэтому адрес микросхемы при чтении информации равен – А1h, а при записи – А0h. Чтение из памяти осуществляется по протоколу, показанному на рис.5.18, где через S обозначено условие старта передачи (соотношение сигналов SCL и SDA), АСК – сигнал подтверждения от памяти (SDA=0), Р – сигнал конца передачи (соотношение сигналов SCL и SDA), перед Р сигнал АСК=1.

Условие передачи по шине: во время присутствия сигнала на линии SDA на линии SCL формируется импульс. Условие старта: из состояния покоя (SDA=SCL=1) линии переходят в состояние SCL=1, SDA=0. Условие конца передачи: после состояния SDA=SCL=0 линии переходят в состояние SDA=0, SCL=1, а затем в состояние покоя – SDA=SCL=1. Условие старта и условие конца передачи показаны на рис.5.19.

Рис.5.19. Условия начала и конца передачи для шины I2C

Рассмотрим только процедуры работы с последовательной памятью EEPROMбез привязки к структуре задач/состояний.

Список процедур обслуживания последовательной памяти EEPROMможет быть следующим:

чтение последовательности байт;

запись последовательности байт;

чтение одного байта;

запись одного байта;

Ниже приведен пример процедур работы с последовательной памятью EEPROM:

  1. Процедура чтения последовательности байт

char FlashSeqRead(int * RdA , char a, char n)

- читает из EEPROM n байт, начиная с адреса a, и записывает их в массив RdA[], указатель на который передается в качестве параметра;

- возвращает: 0 – признак успешного завершения операции чтения;

≠ 0 – признак неудачного завершения операции чтения.

Пример вызова процедуры

FlashSeqRead( BUF, i, k).

  1. Процедура записи последовательности байт

char FlashSeqWrite(int * RdA, char a, char n)

- записывает в EEPROM n байт, начиная с адреса a, из массива RdA[], указатель на который передается в качестве параметра;

- возвращает: 0 – признак успешного завершения операции записи;

≠ 0 – признак неудачного завершения операции записи.

  1. Процедура чтения одного байта

char FlashByteRead(char a):

- читает из EEPROM байт информации по адресу a;

- возвращает: прочитанный байт.

  1. Процедура записи байта

char FlashByteWrite(char a, char d):

- записывает в EEPROM байт d по адресу a;

- возвращает: 1 – признак успешного завершения операции записи;

0 – признак неудачного завершения операции записи.

#include <io51.h>

#define SDA P1.7 /* привязка сигнала к порту, при включении SDA=1 */

#define SCL P1.6 /* привязка сигнала к порту, при включении SCL =1*/

/* процедура чтения последовательности байт: а – адрес начальной ячейки памяти,

n – количество читаемых байт

* RdA – указатель на приемный массив,

возвращает признак выполнения операции */

char FlashSeqRead(int * RdA, char a, char n)

{

char d;

SDA=0; SCL=0; /* условие старта передачи, сначала SDA=0, затем SCL=0 */

d=0xA0; /* d=0xA0 – (А)-признак принадлежности

микросхемы к EEPROM, 0 – признак записи*/

for (i=0;i<8;i++) { d<<=1; SDA=CY; /*сдвиг признака через

перенос и посылка его в линию*/

SCL=1; SCL=0; } /* импульсы записи*/

SDA=1; SCL=1; /* подготовка к приему подтверждения АСК*/

if (!SDA) { /* микросхема готова к обмену?*/

SCL=0; /* да */

for (i=0;i<8;i++) { a<<=1; SDA=CY;

SCL=1; SCL=0;} /*посылка импульсов по линии SCL для

записи начального адреса ячейки памяти */

SDA=1; SCL=1; /* подготовка к приему подтверждения АСК*/

if (!SDA) { /* микросхема готова к обмену?*/

SCL=0; SCL=1; /* да */

SDA=0; SCL=0; d=0xA1; /*d=0xA1 – (А)-признак принадлеж.

микросхемы к EEPROM, 1 – признак чтения*/

for (i=0;i<8;i++) { d<<=1; SDA=CY; /*сдвиг признака

через перенос и посылка его в линию*/

SCL=1; SCL=0; } /* импульсы записи*/

SDA=1; SCL=1; /* подготовка к приему подтверждения АСК*/

a=0;

while (n) {

SCL=0; SDA=1; d=0;

for (i=0;i<8;i++) { /* прием байта информации */

SCL=1; d+=d; if (SDA) d|=1;

SCL=0; }

if (--n) SDA=0; else SDA=1; SCL=1;

RdA[a++]=d; /* запись байта в массив */

}

}

}

SCL=0; SDA=0; /* условие конца передачи */

SCL=1; SDA=1; /* условие конца передачи */

return n; /* возврат признака выполнения операции (успешная запись n=0) */

}

/* процедура записи последовательности:

n байт из массива RdA[] в память, начиная с адреса а,

возвращает признак выполнения операции*/

char FlashSeqWrite(int * RdA, char a, char n)

{

char d;

SDA=0; SCL=0; d=0xA0; /*d=0xA0 – (А)-признак принадлеж.

микросхемы к EEPROM, 0 – признак записи*/

for (i=0;i<8;i++) { d<<=1; SDA=CY; /*сдвиг признака через

перенос и посылка его в линию*/

SCL=1; SCL=0; } /* импульсы записи*/

SDA=1; SCL=1; /* подготовка к приему подтверждения АСК*/

if (!SDA) { /* микросхема готова к обмену?*/

SCL=0; /* да */

for (i=0;i<8;i++) { a<<=1; SDA=CY; ;} /*посылка начального адреса ячейки памяти */

SCL=1; SCL=0; } /* импульсы записи*/

SDA=1; SCL=1; /* подготовка к приему подтверждения АСК*/

a=0;

while (n) {

if (SDA) break; /* выход по неготовности мксх*/

SCL=0; SDA=1; d=RdA[a++]; /* чтение байта из массива*/

for (i=0;i<8;i++) { d<<=1; SDA=CY; /* выдача его в линию */

SCL=1; SCL=0; } /* импульсы записи*/

SDA=0; SCL=1;

n--; }

}

SCL=0; SDA=0; /* условие конца передачи */

SCL=1; SDA=1; /* условие конца передачи */

return n; /* возврат признака выполнения операции (успешная запись n=0) */

}

/* процедура проверки окончания внутренних операций в микросхеме,

возвращает признак занятости */

char FlashBusy()

{

char d;

/* условие старта передачи, сначала SDA=0, затем SCL=0 */

SDA=0; SCL=0; d=0xA1; /*d=0xA1 – (А)-признак принадлеж.

микросхемы к EEPROM, 1 – признак чтения*/

for (i=0;i<8;i++) { d<<=1; SDA=CY; /*сдвиг признака

через перенос и посылка его в линию*/

SCL=1; SCL=0; }

SDA=1; SCL=1;

d=SDA; /* чтение признака занятости в d */

SCL=0; SDA=0; /* условие конца передачи */

SCL=1; SDA=1; /* условие конца передачи */

return d; /* возврат признака занятости */

}

/* процедура чтения байта, а – адрес читаемого байта, возвращает прочитанный байт*/

char FlashByteRead(char a)

{

char d,i;

/* условие старта передачи, сначала SDA=0, затем SCL=0 */

SDA=0; SCL=0; d=0xA0; /*d=0xA0 – (А)-признак принадлеж.

микросхемы к EEPROM, 0 – признак записи*/

for (i=0;i<8;i++) {

if (d & 0x80) SDA=1; else SDA=0; d<<=1; /*посылка признака в линию*/

SCL=1; /* импульсы записи*/

SCL=0; }

SDA=1; SCL=1; /* подготовка к приему подтверждения АСК*/

if (!SDA) { /* микросхема готова к обмену?*/

SCL=0; /* да */

for (i=0;i<8;i++) { /* посылка адреса */

if (a & 0x80) SDA=1; else SDA=0; a<<=1;

SCL=1; /* импульсы записи*/

SCL=0; }

SDA=1; SCL=1; /* подготовка к приему подтверждения АСК*/

if (!SDA) { /* микросхема готова к обмену?*/

SCL=0; SCL=1; /* да */

SDA=0; SCL=0; d=0xA1; /*признак ЕЕРROM и признак чтения*/

for (i=0;i<8;i++) { /* посылка признаков в линию */

if (d & 0x80) SDA=1; else SDA=0; d<<=1;

SCL=1; /* импульсы записи*/

SCL=0; }

SDA=1; SCL=1; /* подготовка к приему подтверждения АСК*/

if (!SDA) { /* микросхема готова к обмену?*/

SCL=0; d=0; /* да */

for (i=0;i<8;i++) { /* чтение байта */

SCL=1; d+=d; if (SDA) d |=1;

SCL=0; }

SDA=1; SCL=1; /* подготовка к приему подтверждения АСК*/

}

}

}

SCL=0; SDA=0; /* условие конца передачи */

SCL=1; SDA=1; /* условие конца передачи */

return d; /* возврат прочитанного байта*/

}

/* процедура записи байта, а –адрес, по которому будет осуществлена запись,

возвращает признак выполнения операции */

char FlashByteWrite(char a, char d)

{

char ca,i;

ca=0xA0; /* признаки ЕЕРROM и записи */

SDA=0; SCL=0; /* условие старта передачи, сначала SDA=0, затем SCL=0 */

for (i=0;i<8;i++) {

if (ca & 0x80) SDA=1; else SDA=0; ca<<=1; /* посылка признака ЕЕРROM и записи

в линию, после сдвигов ca = 0*/

SCL=1; /* импульсы записи*/

SCL=0; }

SDA=1; SCL=1; /* подготовка к приему подтверждения АСК*/

if (!SDA) { /* микросхема готова к обмену?*/

SCL=0; /* да */

for (i=0;i<8;i++) { /* посылка адреса в линию */

if (a & 0x80) SDA=1; else SDA=0; a<<=1;

SCL=1; /* импульсы записи*/

SCL=0; }

SDA=1; SCL=1; /* подготовка к приему подтверждения АСК*/

if (!SDA) { /* микросхема готова к обмену?*/

SCL=0; /* да */

for (i=0;i<8;i++) { /* посылка записываемого байта в линию */

if (d & 0x80) SDA=1; else SDA=0; d<<=1;

SCL=1; /* импульсы записи*/

SCL=0; }

SDA=1; SCL=1; /* подготовка к приему подтверждения АСК*/

ca=SDA; /* установка признака успешной записи*/

}

}

SCL=0; SDA=0; /* условие конца передачи */

SCL=1; SDA=1; /* условие конца передачи */

return ca; /* возврат признака выполнения операции,( = 1 – успешно) */

}