StasRadeon

Модуль I2C в dsPIC33F

7 сообщений в этой теме

StasRadeon    1

Здраствуйте,

появилось такая проблема. захотел запустить программа I2C из даташит. и когда запустил в Протеус , вижу что ждёт здесь : -> 

 while(I2C1STATbits.ACKSTAT);

Можете сказать пожалуйста где ошибся я.

отправляет только MasterWriteI2C1(0xE) и потом ждёт

Код :

#include <p33FJ32GP204.h>
#include<i2c.h>
#include "libpic30.h"
_FOSCSEL(0x02);
_FWDT(FWDTEN_OFF); 
_FOSC(0xE2);

#define OSC          8000000UL				        // тактовая частота главного генератора (задаётся вручную)
#define FCY          OSC/2					// значение для расчёта скорости обмена Ш2С


 void DelayMs(unsigned int Ms) 
 { 
	int delay_cnst; 
	while(Ms>0)
	{ 
	Ms--; 
	for(delay_cnst = 0;
	delay_cnst <220;
	delay_cnst++); 
	}
 } 
 

 int main(void)
{
    unsigned int config2, config1;
 
    unsigned char *wrptr;
 
    unsigned char tx_data[] = {'M','I','C','R','O','C','H','I','P','\0'};
 
    wrptr = tx_data;
 
unsigned int brg = ((FCY)/400000 - ((FCY)/10000000UL))-1;	// данная формула из даташита 
    config2 = brg;

config1 = (I2C1_ON & I2C1_IDLE_CON & I2C1_CLK_HLD &
 
             I2C1_IPMI_DIS & I2C1_7BIT_ADD &
 
             I2C1_SLW_DIS & I2C1_SM_DIS &
 
             I2C1_GCALL_DIS & I2C1_STR_DIS &
 
             I2C1_NACK & I2C1_ACK_DIS & I2C1_RCV_DIS &
 
             I2C1_STOP_DIS & I2C1_RESTART_DIS &
 
             I2C1_START_DIS);
 
  StopI2C1();
  CloseI2C1();
  OpenI2C1(config1,config2);
  DelayMs(100); 
  IdleI2C1();
 
  StartI2C1();
 
  /* Wait till Start sequence is completed */
 
  while(I2C1CONbits.SEN);
 
  /* Clear interrupt flag */
 
  IFS1bits.MI2C1IF = 0;
 
  /* Write Slave address and set master for transmission */
 
  MasterWriteI2C1(0xE);
 
  /* Wait till address is transmitted */
 
  while(I2C1STATbits.TBF);  // 8 clock cycles
 
  while(!IFS1bits.MI2C1IF); // Wait for 9th clock cycle
 
  IFS1bits.MI2C1IF = 0;     // Clear interrupt flag
 
  while(I2C1STATbits.ACKSTAT);
 
  /* Transmit string of data */
 
  MasterputsI2C1(wrptr);
 
  StopI2C1();
 
  /* Wait till stop sequence is completed */
 
  while(I2C1CONbits.PEN);
 
  CloseI2C1();
 
    return 0;
    
}

 

 

I2C.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
my504    176

Слейв ACK отвечает?

Осциллограф в Протеусе что показывает на шине данных на позиции ACK?

  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
StasRadeon    1

когда комментировал:

while(I2C1STATbits.ACKSTAT);

тогда работает, отправляет , но неправильно.

присоединяю что я вижу в PROTEUS

Весь  код и Proteus Simulation в посте в первый пост

I2C_debuger.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    176

Осциллограф параллельно шине подключите. А то птичий язык сниффера Протеуса мне не понятен.

 

  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
StasRadeon    1
30 минут назад, my504 сказал:

Осциллограф параллельно шине подключите. А то птичий язык сниффера Протеуса мне не понятен.

 

там и код на чем там сейчас работаю

 

 

i2c_debug.rar

Изменено пользователем StasRadeon

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    176

Так нет нигде ACK от слейва (везде напротив 9 импульса клока высокий уровень, а ACK - это низкий уровень). Скорее всего, Вы подаете НЕ ЕГО АДРЕС.

I2C - это шина, в которой сначала нужно подать правильный адрес (точнее управляющий байт с адресом и типом последующих данных) слейву и лишь потом данные. Причем в соответствии с протоколом слейва.

Читайте даташит на слейв и там все о протоколе шины имеется.

Изменено пользователем my504
  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
StasRadeon    1

Заработол. Но когда поставил на реальный микроконтроллер не работает. В Протеус работает

Поставил мой код и как подключил hardware . Может чтото не конфигурировал правильно.

 

 

proteus.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сообщения

    • Поигрался с выводом резет. Поставил конденсатор на 0.47 мкф от резет на общий. Без результата. Потом под руки попался на 22 мкф. С этим вроде все работает. Уже раз 20 включаю и выключаю, все сохраняется и  настраивается. Возможно  и меньшая емкость подойдет, надо экспрементировать.
    • Оттого , что транзисторы палёные.
    • Новости с полей почти в онлайн режиме)) оказывается.в моем мультимере есть режим измерения частоты. Подключил- показывает непонятно что. Я рассчитывал около 200Гц получить,(номиналы обвески МС 555: R1=39кОм; R2=35кОм; емкость 54нФ)  и судя по скорости спидометра получил что хотел,а мультимер показывает 19 кГц,при такой частоте спидометр,думаю,заклинил бы
    • 2n5401/2n5551 в токовые зеркала так и не подобрал. Из всего, что было лучшие работать начинали при R44/R45=32k, при этом на больших амплитудах синуса "полка" напряжения на эмиттерных резисторах ВК начинала заметно выгибаться в сторону положительных напряжений. Т.е. как на изображении от @klaid1971 выше, но возбуда нет а "полка" идет по "верхней границе возбуда". При этом на малых сигналах обе полки плоские и оторваны от нуля в соответствующую сторону. Отчего такое может быть? В итоге поставил 2SA970/2SC2240 (перекрутив ножки) - визуально полки плоские, R44/R45=51k.
    • Саш напиши модель  лсд, ссылку
    • Дико извиняюсь.. Но, можно для особо одаренных... Макетку вытравить и спаять не проблема. Если не затруднит, раздайте пожалуйста номиналы по схеме,  типы VD1  VT1. Предпочтительно СМД.  Это не все ещё)))  Каким напряжением питания оррудовать и что на вход настройки подавать? )  По измерялкам.. Готов купить для данных целей частотомер. Но.. В активе имеется осциллогрраф 300МГц. Быть может щуп подобающий к нему приобрести ? Не бросайте пожалуйста плиз.. Впервые с частотами сталкиваюсь.. А вообще.. Вот чего делать хочу научится.. Купил готовые модули на этой микросхеме. И микросхем купил отдельно ещё. Перенес уже эту часть на свою плату. Все ЧИПы выпаивал эксперемента ради с готового модуля и переносил на свою плату. Всё отлично работает. Мне бы теперь для начала понимать насколько завод "дружен" с даташитом. И эксперементирова, эксперементировать,эсперементировать..