Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Вопросы начинающих

Вопросы начинающих Прежде чем задать вопрос, стоит воспользоваться поиском

Ответ
 
Опции темы Опции просмотра
Старый 04.05.2019, 22:19   #1
Zombie47
Senior Member
 
Регистрация: 05.10.2015
Возраст: 32
Сообщений: 137
Вес репутации: 91/0
Zombie47 will become famous soon enough
По умолчанию Как включить I2C шину на Pic16F1847 ?

Не могу заставить работать I2C шину на этом МК.
в инициализации прописываю:

SSP1CON1 = 0b00101000; //page 283
SSP1ADD = 0x19; //page 286 от балды нагуглил.
SSP1STAT = 0b10000000;


Средам Микросси

Код:
void Oledi2c(void) {
  I2C1_Init(100000);         // initialize I2C communication
  I2C1_Start();              // issue I2C start signal
  I2C1_Wr(0xA2);             // send byte via I2C  (device address + W)
  I2C1_Wr(2);                // send byte (address of EEPROM location)
  I2C1_Wr(0xAA);             // send data (data to be written)
  I2C1_Stop();               // issue I2C stop signal
}
в даташите регистр SSPxADD для меня очень не понятен.
Master mode:
bit 7-0 ADD<7:0>: Baud Rate Clock Divider bits
SCLx pin clock period = ((ADD<7:0> + 1) *4)/FOSC

Анализатором тишина.
Zombie47 вне форума   Ответить с цитированием
Старый 04.05.2019, 23:46   #2
Zombie47
Senior Member
 
Регистрация: 05.10.2015
Возраст: 32
Сообщений: 137
Вес репутации: 91/0
Zombie47 will become famous soon enough
По умолчанию Re: Как включить I2C шину на Pic16F1847 ?

Вообщем погуглил и нагуглил на свой МК код и немного его подредактировал под свою среду и тд:
Код:
 unsigned char datas;
//Initialize I2C in master mode, Sets the required baudrate
void I2CInit(void)
{


   SSP1ADD  = ((32000000/4000)/100) - 1;  //((_XTAL_FREQ/4000)/I2C_SPEED) - 1

   SSP1STAT = 0b10000000;   /* Slew rate disabled */
   SSP1CON1 = 0b00101000;   /* SSPEN = 1, I2C Master mode, clock = FOSC/(4 * (SSPADD + 1)) */
}

//Send a start condition on I2C Bus
void I2CStart(void)
{
   SEN_bit = 1;       /* Start condition enabled */
   while(SEN_bit);    /* automatically cleared by hardware */
                               /* wait for start condition to finish */
}

//Send a stop condition on I2C Bus
void I2CStop(void)
{
   PEN_bit = 1;           /* Stop condition enabled */
   while(PEN_bit);        /* Wait for stop condition to finish */
                                   /* PEN automatically cleared by hardware */
}

//Sends a repeated start condition on I2C Bus
void I2CRestart(void)
{
   RSEN_bit = 1;        /* Repeated start enabled */
   while(RSEN_bit);     /* wait for condition to finish */
}

//Generates acknowledge for a transfer
void I2CNck(void)
{
   ACKDT_bit = 0;     // 0 means ACK
   ACKEN_bit = 1;     // Send ACKDT value
   while(ACKEN_bit);    /* wait for ack data to send on bus */
}

//Generates Not-acknowledge for a transfer
void I2CAck(void)
{
   ACKDT_bit = 1;     // 0 means ACK
   ACKEN_bit = 1;     // Send ACKDT value
   while(ACKEN_bit);    /* wait for ack data to send on bus */
}

//wait for transfer to finish
void I2CWait(void)
{
   while ((SSP1CON2 & 0x1F ) || ( SSP1STAT & 0x04 ) );
   /* wait for any pending transfer */
}

//Send 8-bit data on I2C bus - 8-bit data to be sent on bus data can be either address/data byte
void I2CSend(unsigned char dat)
{
   SSP1BUF = dat;    /* Move data to SSPBUF */
   while(BF_bit);       /* wait till complete data is sent from buffer */
   I2CWait();       /* wait for any pending transfer */
}

//Read 8-bit data from I2C bus
unsigned char I2CRead(void)
{
  unsigned char temp;
/* Reception works if transfer is initiated in read mode */
   RCEN_bit = 1;        /* Enable data reception */
   while(!BF_bit);      /* wait for buffer full */
   temp = SSP1BUF;   /* Read serial buffer and store in temp register */
   I2CWait();       /* wait to check any pending transfer */
   return temp;     /* Return the read data from bus */
}


void main()
{

   OSCCON = 0b11110000;
   OSCTUNE = 0b00011100; //Internal 32MHz clock
   OPTION_REG = 0b00000001;
  ANSELA = 0b00000000;  //page 122
  ANSELB = 0b00000000;    //page 127 //âñå ïîðòû RB öèôðîâûå
  TRISA = 0b00000000;
  TRISB = 0b00000000;
   INTCON = 0b10010000;



   I2CInit();


  Delay_ms(100);
  LATB1_bit=0;
  Delay_ms(100);
  LATB1_bit=1;
  Delay_ms(100);
  LATB1_bit=0;
  Delay_ms(100);
  LATB1_bit=1;
  Delay_ms(100);


  Delay_ms(100);
  LATB4_bit=0;
  Delay_ms(100);
  LATB4_bit=1;
  Delay_ms(100);
  LATB4_bit=0;
  Delay_ms(100);
  LATB4_bit=1;
  Delay_ms(100);



   do {

I2CStart();                 // Send start bit on i2c
I2CSend(0xD2);         // Send data on i2c
I2CSend(0x00);          //Set register position
I2CRestart();
I2CSend(0xD3);              // Read from 0xC
I2CAck();
datas = I2CRead();       // Read value from i2c
I2CStop();    // Send stop bit on i2c
           delay_ms(200); //Turn on for half a second

   } while (1);


}
Первый вопрос. В примере у человека было написано что он из устройства хочет сделать Slave и поэтому я вижу у него в коде было прописано
TRISBbits.TRISB1 = 1; // SDA Data pin direction
TRISBbits.TRISB4 = 1; // SCL Clock pin direction

я поменял эти ноги на выход. так как у меня устройство мастер.

далее я всегда в коде ставлю дерганье ногами чтоб посмотреть работают ли ноги:
Код:
Delay_ms(100);
  LATB1_bit=0;
  Delay_ms(100);
  LATB1_bit=1;
  Delay_ms(100);
  LATB1_bit=0;
  Delay_ms(100);
  LATB1_bit=1;
  Delay_ms(100);


  Delay_ms(100);
  LATB4_bit=0;
  Delay_ms(100);
  LATB4_bit=1;
  Delay_ms(100);
  LATB4_bit=0;
  Delay_ms(100);
  LATB4_bit=1;
  Delay_ms(100);
В данном случае если закомментить функцию I2CInit(); то ногами дергает. тоесть затыкается на этой функции.
Zombie47 вне форума   Ответить с цитированием
Старый 05.05.2019, 00:23   #3
pfgx
Senior Member
 
Регистрация: 14.11.2007
Сообщений: 1,106
Вес репутации: 822/63
pfgx is a splendid one to beholdpfgx is a splendid one to beholdpfgx is a splendid one to beholdpfgx is a splendid one to beholdpfgx is a splendid one to beholdpfgx is a splendid one to beholdpfgx is a splendid one to behold
По умолчанию Re: Как включить I2C шину на Pic16F1847 ?

Нет. Функция инициализирует модуль, после чего ногами управляет уже он, LAT игнорируется. Затыкается где-то дальше.

Анализатором вообще тишина или всё-таки один байт передаётся? На линиях 0 или 1?
pfgx вне форума   Ответить с цитированием
Старый 05.05.2019, 00:27   #4
Zombie47
Senior Member
 
Регистрация: 05.10.2015
Возраст: 32
Сообщений: 137
Вес репутации: 91/0
Zombie47 will become famous soon enough
По умолчанию Re: Как включить I2C шину на Pic16F1847 ?

как же я не люблю внимательно все читать ))))
в даташите написано 1 = Enables the serial port and configures the SDAx and SCLx pins as the source of the serial port pins(3)
и сносочка 3
а в ней написано:
When enabled, the SDAx and SCLx pins must be configured as inputs.

INPUTS елы палы!
Где логика? я конфигурирую SDA и SCL это по сути выходные сигналы от мастера, а в даташите написано что надо сконфигурировать их как ВХОДНЫЕ
Zombie47 вне форума   Ответить с цитированием
Старый 05.05.2019, 00:39   #5
pfgx
Senior Member
 
Регистрация: 14.11.2007
Сообщений: 1,106
Вес репутации: 822/63
pfgx is a splendid one to beholdpfgx is a splendid one to beholdpfgx is a splendid one to beholdpfgx is a splendid one to beholdpfgx is a splendid one to beholdpfgx is a splendid one to beholdpfgx is a splendid one to behold
По умолчанию Re: Как включить I2C шину на Pic16F1847 ?

Цитата:
Сообщение от Zombie47 Посмотреть сообщение
Где логика?
Логика в документе DS41453B на странице 234. FIGURE 25-2: MSSPX BLOCK DIAGRAM.
Надо отключить выходной push-pull драйвер порта (TRIS=1), а модуль будет управлять выводами при помощи собственных транзисторов.
pfgx вне форума   Ответить с цитированием
Старый 05.05.2019, 08:11   #6
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 46
Сообщений: 1,684
Вес репутации: 2423/83
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: Как включить I2C шину на Pic16F1847 ?

Цитата:
Сообщение от Zombie47 Посмотреть сообщение
INPUTS елы палы!
Где логика? я конфигурирую SDA и SCL это по сути выходные сигналы от мастера,

Почему "выходные"? Они то выходные, то входные, в зависимости от состояния шины и конкретного места во времени, при ее работе.
Поэтому и управляются от переферии I2C а не от переферии портов, которая только должна не мешать.
DimaS вне форума   Ответить с цитированием
Старый 05.05.2019, 16:37   #7
Zombie47
Senior Member
 
Регистрация: 05.10.2015
Возраст: 32
Сообщений: 137
Вес репутации: 91/0
Zombie47 will become famous soon enough
По умолчанию Re: Как включить I2C шину на Pic16F1847 ?

понял тоесть логика такова. ставим порты на вход чтоб не мешать переферии i2c верно?
Zombie47 вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PIC16F675-нужна помощь Surfer Вопросы начинающих 18 27.07.2011 23:49
PIC16F84a stepka Вопросы начинающих 56 24.03.2010 18:30
Часы на pic 16f874a и ds1307n работают, но не работают faramun21 Продукция MICROCHIP 8 10.07.2009 04:40
GSM-модуль Siemens (Cinterion) TC65 и шина I2C Avilon Общетехнические вопросы 4 28.06.2009 13:22
как включить курсор в ЖКИ WH-1602 herman Общетехнические вопросы 17 24.11.2008 23:08


Часовой пояс GMT +3, время: 21:27.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot