PIC. Урок 19. MSSP. I2C. Подключаем внешний EEPROM. Часть 3

 

 

 

В предыдущей части урока мы познакомились с микросхемой памяти EEPROM AT24C32D, настроили наш проект и написали ряд служебных функций.

 

Прежде чем теперь мы займёмся непосредственно записью и чтением памяти микросхемы, перейдём в файл led.c и немного его поправим, так как он у нас настроен для отображения показаний АЦП, включена точка, отключается 4 разряд в случае 3-значного числа. Мы будем гасить также и 3 разряд в случае 2-значного числа и гасить 2-й в случае однозначного.

Поэтому 4 разряд мы не трогаем, а идём в функцию TIM0_Callback сразу в условие формирования 3 разряда (else if(n_count==1)) и первым делом удалим там включение точки

 

PORTB &= ~0x80;

 

Вместо этого вставим тушение разряда, если у нас число меньше 3 знаков

 

segchar(R2);

if(num_gl<100) PORTB = 0xFF;

 

В условии формирования 2-го разряда также добавим тушение разряда, если число 1-значное

 

segchar(R3);

if(num_gl<10) PORTB = 0xFF;

 

Вернёмся в файл main.c и добавим адрес, с которого мы будем начинать запись в микросхему, а также затем считывать записанное, также массив с заранее заготовленными величинами для записи в микросхему, а также аналогичный массив, забитый нулями, в который мы будем затем считывать записанные значения из микросхемы

 

#define DEV_ADDR 0xAE

#define address 0x0A

//------------------------------------------------

unsigned int TIM1_Count=0;

const unsigned char at24c_data_write[]={0x14,0x13,0x12,0x11,0x10,

0x0F,0x0E,0x0D,0x0C,0x0B,

0x0A,0x09,0x08,0x07,0x06,

0x05,0x04,0x03,0x02,0x01};

unsigned char at24c_date[20];

 

Перейдём в функцию main() и попробуем записать наш массив в микросхему по заданному адресу

 

SSPCON=0X38;

//write

I2C_StartCondition();

AT24C_WriteBytes(0x000A,at24c_data_write,20);

I2C_StopCondition();

__delay_ms(5);

 

По окончанию записи мы немного подождём. Причём величина этой задержки может зависеть от количества переданных байтов, так что можете поиграть у себя.

Пока давайте проверим только запись. Для этого запустим программу логического анализа, соберём код, прошьём контроллер и посмотрим там результат.

Только сначала настроим программу. Включим 2 канала, на одном из них поставим триггер, срабатывающий на спад сигнала

 

 

Шину I2C настроим следующим образом

 

 

Запустим анализ, перезагрузим контроллер и посмотрим результат (нажмите на картинку для увеличения размера)

 

 

Также посмотрим результат в анализе

 

 

Вроде всё отлично.

 

 

Теперь попробуем данные прочитать. Для этого продолжим код в main()

 

__delay_ms(5);

//read

SSPIF=0;

I2C_StartCondition();

AT24C_ReadBytes(0x000A,at24c_date,20);

I2C_StopCondition();

SSPIF=0;

__delay_ms(1);

 

Проведём логический анализ (нажмите на картинку для увеличения размера)

 

 

Всё прочиталось. Отлично!

Также мы видим, что последний байт получен без подтверждения

 

 

Отобразим по очереди на индикаторе значения считанного участка памяти EEPROM

 

__delay_ms(1);

for(i=0;i<20;i++)

{

  ledprint(at24c_date[i]);

  __delay_ms(500);

}

 

Также в бесконечный цикл запишем традиционную задержку

 

while(1)

{

  __delay_ms(5);

}

 

Код, предназначенный для записи ячеек памяти, закомментируем, у нас уже всё записано в энергонезависимую память, тем самым мы проверим, хранятся ли значения.

 

//write

/*

I2C_StartCondition();

AT24C_WriteBytes(0x000A,at24c_data_write,20);

I2C_StopCondition();

__delay_ms(5);

*/

 

Соберём код, прошьём контроллер, перед этим отключив программатор от питания и заново подключив его, чтобы убедиться также, что данные хранятся и после потери питания микросхемой. Анализатор от схемы также можно отключить, он нам больше не нужен. После прошивки кода мы должны увидеть наши циферки на индикаторе

 

 

 

Все значения отобразились. Значит они надёжно хранятся во внешней памяти EEPROM.

Таким образом, в данном занятии мы научились работать с шиной I2C в режиме ведущего устройства. Теперь мы с помощью данной шиной можем общаться с внешними ведомыми устройствами. Мы умеем посылать на них данные по шине I2C, а также их принимать от них.

Всем спасибо за внимание!

 

Предыдущая часть Программирование МК PIC Следующий урок

 

Исходный код

 

 

Купить программатор (неоригинальный) можно здесь: PICKit3

Купить программатор (оригинальный) можно здесь: PICKit3 original

Отладочную плату PIC Open18F4520-16F877A можно приобрести здесь: PIC Open18F4520-16F877A

Модуль RTC DS3231 с микросхемой памяти (3 шт)

Модуль RTC DS3231 с микросхемой памяти (1 шт) — так дороже

Индикатор 4-разрядный LED WaveShare можно приобрести здесь: LED WaveShare

Логический анализатор 16 каналов можно приобрести здесь

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

PIC MSSP. I2C. Подключаем внешний EEPROM

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*