Установка регистра i2c в высокий

У меня есть этот проект, который мой начальник попросил меня сделать, и первым делом нужно выяснить, как установить высокий или низкий уровень данного регистра I2C с помощью библиотеки Silicon Lab. Если кто-нибудь знает какие-либо хорошие источники для такого рода проблем, пожалуйста, предоставьте их благодарю вас. Pic, который я использую, - это pic16f1823, я уже посмотрел документацию к картинке, но только о том, как читать и писать на I2c.

1 ответ

Я использую это как заголовочный файл и, кажется, хорошо работает для PIC16F1827, который в основном такой же, как 1823. Он использовал периферийные устройства PIC. Просто включите в любой файл c, в котором вы хотите использовать i2c. Убедитесь, что вы #define FOSC, чтобы рассчитать правильную скорость передачи. Также дважды проверьте правильность назначений портов и Трис для вашего устройства и внесите коррективы.

Он использует опрос вместо прерывания. Раскомментируйте код установки прерываний и напишите процедуру обработки прерываний, чтобы перехватывать прерывания.

  #ifndef I2C_H
  #define   I2C_H

  #ifdef    __cplusplus
  extern "C" {
  #endif

  /*
   * Hi-Tech C I2C library for 12F1822
   * Master mode routines for I2C MSSP port to read and write to slave device 
   * Copyright (C)2011 HobbyTronics.co.uk 2011
   * Freely distributable.
  */

  #define I2C_WRITE 0
  #define I2C_READ 1

  // Initialise MSSP port. (12F1822 - other devices may differ)
  void i2c_Init(void){

      // Initialise I2C MSSP
      // Master 100KHz

      TRISB2 = 1;
      TRISB5 = 1;
      SSP1CON1 = 0b00101000; // I2C Master mode
      SSP1CON2 = 0b00000000; 
      SSP1CON3 = 0b00000000; 

      //SSP1MSK  = 0b00000000; 
      SSP1ADD  = I2C_BRG; // clock = FOSC/(4 * (SSPxADD+1))
      //SSP1IE = 1; // enable interrupt
      SSP1STAT = 0b10000000;
  }

  // i2c_Wait - wait for I2C transfer to finish
  void i2c_Wait(void){
      while ( ( SSP1CON2 & 0x1F ) || ( SSPSTAT & 0x04 ) );
  }

  // i2c_Start - Start I2C communication
  void i2c_Start(void)
  {
      i2c_Wait();
      SSP1CON2bits.SEN=1;
  }

  // i2c_Restart - Re-Start I2C communication
  void i2c_Restart(void){
      i2c_Wait();
      SSP1CON2bits.RSEN=1;
  }

  // i2c_Stop - Stop I2C communication
  void i2c_Stop(void)
  {
      i2c_Wait();
      SSP1CON2bits.PEN=1;
  }

  // i2c_Write - Sends one byte of data
  void i2c_Write(unsigned char data)
  {
      i2c_Wait();
      SSPBUF = data;
  }

  // i2c_Address - Sends Slave Address and Read/Write mode
  // mode is either I2C_WRITE or I2C_READ
  void i2c_Address(unsigned char address, unsigned char mode)
  {
      unsigned char l_address;

      l_address=address<<1;
      l_address+=mode;
      i2c_Wait();
      SSPBUF = l_address;
  }

  // i2c_Read - Reads a byte from Slave device
  unsigned char i2c_Read(unsigned char ack)
  {
      // Read data from slave
      // ack should be 1 if there is going to be more data read
      // ack should be 0 if this is the last byte of data read
      unsigned char i2cReadData;

      i2c_Wait();
      SSP1CON2bits.RCEN=1;
      i2c_Wait();
      i2cReadData = SSPBUF;
      i2c_Wait();
      if ( ack ) SSP1CON2bits.ACKDT=0;          // Ack
      else       SSP1CON2bits.ACKDT=1;          // NAck
      SSP1CON2bits.ACKEN=1;                    // send acknowledge sequence

      return( i2cReadData );
  }

  #ifdef    __cplusplus
  }
  #endif

  #endif    /* I2C_H */

Затем вы можете использовать функции более высокого уровня, определенные выше, для управления устройством, которое описано в техническом описании подчиненного устройства.

Например, чтобы прочитать с eeprom:

  #include <xc.h>
  #define FOSC 16000000
  #include "i2c.h"

  unsigned char i2c_read_eeprom( unsigned char slaveaddress, unsigned char memaddress )
  {
      unsigned char data;

      data = 123;

      i2c_Start();
      i2c_Address( slaveaddress, I2C_WRITE);
      i2c_Write(memaddress);
      if( SSP1CON2bits.ACKSTAT )
           txstring("ACK!\r\n");
      else txstring("nACK!\r\n");

      i2c_Start();
      i2c_Address( slaveaddress, I2C_READ);
      data = i2c_Read(0);

      i2c_Stop();

      return data;
  }
Другие вопросы по тегам