i2с c помощью библиотечных функций

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

i2с c помощью библиотечных функций

Сообщение Hispanus »

Здравствуйте! В примере из книги Шпака интерфейс (протокол) i2c реализуется с помощью библиотечных функций. На первый взгляд показалось всё легко и понятно, но при попытке реализовать управляющую программу на этих функциях ничего не получилось. Чтение из ячейки памяти, куда только что было записано число 4, дает число 0хFF.

Код: Выделить всё

#include <16f628a.h>
#use delay(clock=1000000)
#fuses INTRC,NOWDT
#use i2c(Master,Slow,sda=PIN_A1,scl=PIN_A0,force_hw)
#byte TRISA = 0x85
#byte PORTB = 0x06
#byte TRISB = 0x86
#byte PORTA = 0x05

void main()
{
  int8 c1=4;
  int8 c2=0;
 
  PORTA=0b00000000;
  TRISB=0b00000000;
  PORTB=0b00000000;
  TRISA=0b00011;
 
 
      i2c_start();
      //Инициализация передачи
     
      i2c_write(0b10100000);
      //Адрес Slave с запросом на запись
     
      i2c_write(0b00000000);
      i2c_write(0b00000000);
      //Старший и младший байт памяти
     
      i2c_write(c1);
      //Запись в память
     
      i2c_stop();
      //Прекращение передачи
     
      delay_ms(1000);
     
      i2c_start();
      //Инициализация передачи
     
      i2c_write(0b10100001);
      //Адрес Slave с запросом на чтение
     
      i2c_write(0b00000000);
      i2c_write(0b00000000);
      //Старший и младший байт памяти
     
      c2=i2c_read(0);
      //Чтение из памяти без бита подтверждения
     
      i2c_stop();
      //Прекращение передачи
     
      if (c2==4)
      PORTB=0b1000000;
     
      delay_ms(3000);
}


А вот, что получается на экране осциллографа:
Вложения
Схема.JPG
Схема
(142.83 КБ) 183 скачивания
Чтение.JPG
Чтение
(145.36 КБ) 189 скачиваний
Запись.JPG
Запись
(146.29 КБ) 175 скачиваний
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: i2с c помощью библиотечных функций

Сообщение urry »

у вас проблемы с адресацией.
Адрес нельзя прочитать, он только устанавливается.
При каждом обращении он автоматически инкрементируется внутри - те в данном случае вы пытаетесь прочитать ячейку, следующую за той, куда писали.
пробуйте так

Код: Выделить всё

      i2c_start();
      //Инициализация передачи
      i2c_write(0b10100000);// запись !!!
      //
     //!! адрес только пишется !!!
      i2c_write(0b00000000);
      i2c_write(0b00000000);

      //Старший и младший байт памяти
     i2c_start(); // рестарт
      i2c_write(0b10100001);// чтение !!!
      c2=i2c_read(0);
      //Чтение из памяти без бита подтверждения
      i2c_stop();
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

Re: i2с c помощью библиотечных функций

Сообщение Hispanus »

urry спасибо Вам за совет, но ничего не получилось с этими функциями. Решил реализовать этот протокол аппаратно, с помощью модуля MSSP. Руководствуясь ДШ, написал две программки - одну для ведущего , другую для ведомого. Кратко опишу их. После того как ведущий открывает канал связи с ведомым, он (ведущий) отправляет ведомому байт, содержащий адрес ведомого и бит направления передачи. Ведомый же, узнав, что канал связи открыт, принимает этот байт. Если адрес содержащийся в этом байте совпадает с адресом ведомого и при условии, что буфер ведомого будет пуст и не переполнен, то этот байт загружается в буфер обмена ведомого (SSPBUF). При этом бит BF установится в "1", просигналив, что буфер полон и пора считывать оттуда данные. Вот как раз этот бит у меня и не устанавливается в "1". В чем я ошибся?
Код ведущего

Код: Выделить всё

void main (void) 
{
   int8 ADD=0b1010000;
   //Адрес ведомого
   
   TRISA=0b00000000;
   PORTA=0b00000000;
   
   delay_ms(2000);
   //Программная задержка
   
   GIE=1;
   //Глобальное разрешение прерываний
   
   PEIE=1;
   //Разрешение прерываний от периферийных устройств
   
   SSPEN=1;
   //Включить модуль MSSP
   
   SSPM3=1;
   SSPM2=0;
   SSPM1=0;
   SSPM0=0;
   //Ведущий режим
   
   CKE=0;
   //Выходные уровни соответствуют спецификации i2c
   
   SEN=1;
   //Сформировать старт
 
   if (SSPIF==1)
   //Старт сформирован
      {
         SSPIF=0;
         //Программная очистка
         
         PORTA=0b00000001;
         
         SSPBUF=ADD | 0b00000000;
         //Передача адреса ведомого с запросом на запись
           
      }
     
}


Код ведомого

Код: Выделить всё

void main (void) 
{
   TRISA=0b00000000;
   PORTA=0b00000000;
   PORTB=0b00000000;
   TRISB=0b00000000;
   
   GIE=1;
   //Глобальное разрешение прерываний
   
   PEIE=1;
   //Разрешение прерываний от периферийных устройств
   
   SSPEN=1;
   //Включить модуль MSSP
   
   SSPM3=0;
   SSPM2=1;
   SSPM1=1;
   SSPM0=0;
   //Ведомый режим 7 разрядная адресация
   
   SSPADD=0b1010000;
   //Задание адреса ведомого
   
   SSPBUF=0b00000000;
   //Очистка буфера обмена
   
   CKE=0;
   //Выходные уровни соответствуют спецификации i2c
   
   BF=0;
   //Буфер пуст
   
   SSPOV=0;
   //Буфер приемника не переполнен
   
   while(1)
   {
   
      if (S==1)
      //Старт бит обнаружен
 
      {

         if (BF==1)
            {
               A0=1;
            }
      }
   
   }
     
}


Осциллограмма передачи
Вложения
i2c.JPG
Осциллограмма передачи
(66.31 КБ) 183 скачивания
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
nirq
Опытный кот
Сообщения: 758
Зарегистрирован: Вс фев 10, 2013 15:26:00

Re: i2с c помощью библиотечных функций

Сообщение nirq »

Самая граблистая грабля в такого рода занятиях:

изучается взаимодействие между двумя независимыми друг от друга сущностями.

Одна из сущностей (мастер) перед началом очередного сеанса приводится в строго определённое состояние (ресетится), потому что без этого никак нельзя обойтись (при перепрошивке).
Вторая же сущность (слейв)...



И: сабжовый слейв может придерживать клок с своей стороны, а мастеру более чем желательно это дело понимать как "братан тормозни".


(несерьёзно копаться в подробностях частного случая конкретной реализации вместо того, кто её реализует)
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

Re: i2с c помощью библиотечных функций

Сообщение Hispanus »

После нескольких дней штудирования ДШ и благодаря одной очень крутой статейки мне удалось наконец оживить i2c (но только в режиме мастера). МК связан с внешней памятью и осуществляет сначала запись в нее, а потом чтение того, что записал. Кому интересно могу выложить тестовый проект в протеусе. Всем спасибо.
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
Ответить

Вернуться в «PIC»