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    155

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

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

  • Одобряю 1

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


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

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

while(I2C1STATbits.ACKSTAT);

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

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

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

I2C_debuger.rar

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


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

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

 

  • Одобряю 1

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


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

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

 

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

 

 

i2c_debug.rar

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

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


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

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

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

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

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

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


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

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

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

 

 

proteus.rar

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


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

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

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

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

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

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

Войти

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

Войти сейчас