将 i2c 寄存器设置为高

Posted

技术标签:

【中文标题】将 i2c 寄存器设置为高【英文标题】:setting an i2c register to high 【发布时间】:2017-05-30 16:03:03 【问题描述】:

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

【问题讨论】:

你试图做些什么来研究这个?你用过流行的搜索引擎吗?您是否参考过硅实验室库的文档或来源?提供有关您的代码将在哪个处理器上运行的提示可能会有所帮助 - 您应该编辑您的问题以包含更多信息。 刚刚编辑了它@barny 【参考方案1】:

我用这个作为头文件,对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;
  

【讨论】:

以上是关于将 i2c 寄存器设置为高的主要内容,如果未能解决你的问题,请参考以下文章

MCS51单片机中,当中断优先级寄存器的内容为09H时,其含义是啥?谢谢

支持 16 位地址的 I2c

I2C硬件与模拟的区别

Linux I2C总线驱动调试之i2c-tools工具使用

STM32 I2C 只传输一次

GPIO 配置之ODR, BSRR, BRR 详解