Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Уч. пос. МПТ (2.04.12).pdf
Скачиваний:
403
Добавлен:
22.03.2015
Размер:
10.95 Mб
Скачать

17.Установить флаг готовности Finish в единицу. Это приведет к прекращению выполнения цикла (блок 5).

18.Сбросить флаг готовности I2C, записав единицу в блок SI регистра I2C0CONCLR. Сброс SI активирует изменение состояния I2C или передачу очередного байта данных.

19.Выполнить индикацию одного или нескольких байт в целях проверки работоспособности программы. Ниже приведен пример индикации 10го 5-го элемента массива в 16-ричном коде.

snprintf(s,11,"Data[5]=%2X",Data[5]);

PrintSymbol(s,1);

Формат индицируемого изображения таков:

Data[5]=5F

Размер индикатора позволит отображать не более 10 шестнадцатеричных чисел, поэтому для полноценной проверки рекомендуется воспользоваться окном Watch среды Keil uVision, остановив программу на выполнение вечного цикла (блок 20).

3.20.7 Разработка функции записи блока данных в EEPROM

Как было показано в разделе 3.20.5, запись данных в EEPROM желательно производить блоками по несколько байт. Размер блока зависит от типа микросхемы памяти. Для CAT1025 он составляет 16 байт. После передачи каждого блока необходимо выдержать паузу не менее 5 мс.

Рекомендуется оформить функцию записи блока. Схема такой функции показана на рисунке 3.20.4

Функция должна содержать объявление двух локальных переменных целого типа: счетчика n и флага готовности Finished, которому здесь же необходимо присвоить нулевое начальное значение.

1. Функция имеет несколько параметров: массив байтов Data (на схеме показан в блоке 6); N — число байт, которые требуется записать; Addr — адрес первого байта для записи. Объявление функции может выглядеть так:

EEPROM_Write(unsigned char *Data,

unsigned int N, unsigned char Addr);

2. Функция начинается с установки состояния START на шине I2C

(бит STA в регистре I2C0CONSET).

3–5. Блоки абсолютно идентичны блокам 5–7 предыдущей программы. Здесь их не комментируем, также как и некоторые последующие.

9. Записать конструкцию проверки неравенства счетчика n и числа записываемых байт N.

10–11. Если , выполнить передачу очередного байта и инкрементировать счетчик

I2C0DAT=Data[n++];

12–13. Иначе сформировать условие STOP и установить флаг завершения записи Finish.

230

 

Начало

 

 

 

 

0x08

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

7

 

 

 

Ввод N, Addr

 

 

 

 

 

Сброс START,

 

 

 

 

 

 

 

 

 

2

 

 

 

 

передача адреса и W

 

 

 

 

 

 

 

 

 

 

Установка START

 

 

 

 

 

 

 

 

 

 

0x18

 

 

 

3

 

 

 

 

8

 

 

Нет

 

 

 

 

Передача адреса байта

 

 

Finish = 0?

 

 

 

 

 

 

 

 

 

 

 

 

 

0x28

 

 

 

Да

 

 

 

 

 

 

 

 

4

 

 

 

Нет

9

 

Да

 

2

 

n < N ?

 

 

 

Готовность I

C

 

 

 

 

 

 

 

 

 

 

 

Да

 

 

 

 

Нет

 

10

 

 

 

 

 

 

 

 

 

 

 

 

 

12

 

Сохранить

 

 

 

 

 

 

 

 

 

5

 

 

 

 

Сформировать STOP

байт в Data[n]

 

 

 

 

 

 

 

 

 

2

C

 

 

 

 

 

Состояние I

 

 

13

 

11

 

 

 

 

 

 

 

 

 

 

 

 

 

Finish = 1

 

n = n + 1

 

6

 

 

 

 

Иначе

 

 

 

 

 

 

 

 

 

 

 

Возврат Data

 

 

 

 

 

 

 

 

 

 

14

 

 

 

 

 

 

 

 

Сбросить флаг

 

 

Конец

 

 

 

 

2

C

 

 

 

 

 

 

готовности I

 

Рисунок 3.20.4 – Схема подпрограммы записи блока данных в память EEPROM

Для проверки работоспособности функции необходимо составить основную программу. Программа проста, поэтому ее схему не приводим. Программа должна содержать команды настройки режима порта и модуля I2C0 (блоки 2–3) на рисунке 3.20.3. Далее требуется вызвать функцию

EEPROM_Write, например, так

EEPROM_Write(Data,sizeof(Data),0x80);

Здесь оператор sizeof дает число байт в массиве Data. Считается, что эта величина не превышает 16. Если требуется записать боле одного блока из 16 байт, то потребуется другой код

#define N sizeof(Data) for (k=0;k<N;k+=16)

{

EEPROM_Write(&Data[k], N-k<16?N-k:16, 0x80+k); Delay(75000);

}

Дадим некоторые пояснения. Директива #define ставит в соответствие оператору взятия размера sizeof более короткое обозначение N. Условный оператор

N-k<16 ? N-k : 16

231