Перейти к содержанию

Модуль I2C в dsPIC33F


StasRadeon

Рекомендуемые сообщения

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

появилось такая проблема. захотел запустить программа 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

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

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

while(I2C1STATbits.ACKSTAT);

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

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

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

I2C_debuger.rar

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

30 минут назад, my504 сказал:

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

 

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

 

 

i2c_debug.rar

Изменено пользователем StasRadeon
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

戦う前に相手のベルトの色に注目

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

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

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

 

 

proteus.rar

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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...