-1

我有一个老板让我做的项目,第一步是弄清楚如何使用硅实验室库将给定的 I2C 寄存器设置为高或低,如果有人知道此类问题的任何良好来源,请提供谢谢你。我使用的图片是 pic16f1823,我已经查看了图片的文档,但只说明了如何读取和写入 I2c。

4

1 回答 1

0

我用这个作为头文件,似乎对 PIC16F1827 效果很好,它和 1823 基本一样。它使用了 PIC 的外设。只需包含在您要使用 i2c 的任何 c 文件中。确保您 #define FOSC 以计算正确的波特率。还要仔细检查端口和 tris 分配是否适合您的设备并进行调整。

它使用轮询而不是中断。取消注释中断设置代码并编写中断服务程序来捕获中断。

  #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;
  }
于 2017-05-31T10:58:54.993 回答