金沙js5线路(中国)有限公司

技术热线: 4007-888-234

PIC16F7x 单片机和 I2C master mode

更新时间: 2019-03-23
阅读量:2429

十年专注单片机方案开发的方案公司金沙js5线路,分享PIC16F7x 单片机和 I2C master mode。金沙js5线路现提供服务产品涉及主控芯片:8位单片机、16位单片机、32位单片机及各类运算放大器等。

#define SCL TRISC3 //I2c数据通讯频率口

#define SDA TRISC4 //I2c数据通讯数据口

//================================================================================================= //i2c操作 部分 /*八个子程序组成 i2c 基本操作单元 等待子程序 delay_4us() 启动i2c总线 start_i2c() 关闭i2c总线 stop_i2c() 发送应答位 send_ack() 发送单字节 send_byte() 接收单字节 receive_byte() i2c多字节读 read_i2c(uchar sla,uchar suba,uchar *s,uchar no) i2c多字节写 write_i2c(uchar sla,uchar suba,uchar *s,uchar s_add,uchar no) */ /*------------------------------------------------------------------------------ 等待4us */

delay_4us() {uchar i;i=4; while(i--){;}} /*------------------------------------------------------------------------------

起动总线函数启动波形

SDA

SCL

*/

void start_i2c() { SDA=1; delay_4us(); SCL=1; delay_4us(); SDA=0; delay_4us(); SCL=0; delay_4us(); }

/*--------------------------------------------------------------------------------- 停止总线函数函数原型: void stop_i2c(); Function: stop the I2C bus */ void stop_i2c() {

SDA=0; //发送结束条件的数据信号 delay_4us();

SCL=1; delay_4us(); SDA=1; delay_4us(); }

/*--------------------------------------------------------------------------------- 发送ACK 函数原型: void send_ack(); Function: */ void send_ack() { SDA=0;//发送ack信号 delay_4us(); SCL=1;//钳住I2C总线,准备发送数据或接收数据 delay_4us(); SCL=0; }

/*--------------------------------------------------------------------------------- 字节数据传送函数函数原型: void send_byte(uchar c); Function: 将数据C发送出去,可以是地址,也可以是数据,发完后等待回应,并对此状态位进行操作(不应答或非应答都使ack=0 ),发送数据正常,ack=1;ack=0 表示被控器无应答或损坏。 */ void send_byte(uchar c) { uchar bit_count; for (bit_count=0;bit_count<8;bit_count++) { if ((c<

SDA=1; delay_4us();

SCL=1; delay_4us();

if (RC4==1) ack=0; else ack=1; //用ACK=1为有应答信号 SCL=0; delay_4us();

}

/* 字节数据接收函数函数原型:uchar receive_byte(); FUNCTION: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),发完后请用应答函数。 ===================================================================*/ uchar receive_byte() { uchar retc,bit_count; retc=0;

SDA=1; for(bit_count=0;bit_count<8;bit_count++) { delay_4us(); SCL=0; delay_4us(); SCL=1; delay_4us(); retc=retc<<1; if (RC4==1)retc=retc+1; delay_4us(); } SCL=0; delay_4us(); return (retc); }

/*-----------------------------------------------------------------------------

*/ write_i2c(uchar sla,uchar suba,uchar *s,uchar s_add,uchar no) { uchar i; no=no+s_add; start_i2c(); //启动i2c总线 send_byte(sla); //发送写命令和器件地址 send_byte(suba); //发送数据地址 s=s+s_add; for(i=s_add;i

*/

read_i2c(uchar sla,uchar suba,uchar *s,uchar no) { uchar i; start_i2c(); //启动i2c总线 send_byte(sla); //发送写命令和器件地址 send_byte(suba); //发送数据地址 start_i2c(); //重新启动总线。 send_byte(sla+1); //发送读命令和器件地址DEVICE ADDRESS。 *s=receive_byte(); //读当前地址数据 for(i=1;i

} //i2c操作部分结束 //=================================================================================================

(文源网络,侵删)

XML 地图