将 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 寄存器设置为高的主要内容,如果未能解决你的问题,请参考以下文章