#include "main.h"<br /><br />#ifndef __I2C_H<br />#define __I2C_H<br /><br />#define I2CBAUD 800000//800KHz 本程序是读写铁电的,故速度很高 <br /><br />//下面的是I2C的标准状态表,因为PIC的不标准,故凑合着用和补充了加注解的部分~~~<br />enum enum_I2CState<br />{<br />/* Master */<br /> I2C_START = 0x08,//启动<br /> I2C_REP_START= 0x10,//重启动<br />/* Master Transmitter */<br /> I2C_MT_SLA_ACK= 0x18,//主发模式下得到从机地址应答信号<br /> I2C_MT_SLA_NACK= 0x20,<br /><br /> I2C_MT_DATA_ACK= 0x28,//主发模式下得到从机数据应答信号<br /> I2C_MT_DATA_NACK= 0x30,<br /><br /><br /><br /> I2C_MT_ARB_LOST= 0x38,<br />/* Master Receiver */<br /> I2C_MR_ARB_LOST= 0x38,<br /> I2C_MR_SLA_ACK= 0x40,//主收模式下得到从机地址应答信号<br /> I2C_MR_SLA_NACK= 0x48,<br /> I2C_MR_DATA_ACK= 0x50,<br /> I2C_MR_DATA_NACK= 0x58,<br /><br />/* Slave Transmitter */<br /> I2C_ST_SLA_ACK= 0xA8,<br /> I2C_ST_ARB_LOST_SLA_ACK= 0xB0,<br /> I2C_ST_DATA_ACK= 0xB8,<br /> I2C_ST_DATA_NACK= 0xC0,<br /> I2C_ST_LAST_DATA= 0xC8,<br />/* Slave Receiver */<br /> I2C_SR_SLA_ACK= 0x60,<br /> I2C_SR_ARB_LOST_SLA_ACK= 0x68,<br /> I2C_SR_GCALL_ACK= 0x70,<br /> I2C_SR_ARB_LOST_GCALL_ACK= 0x78,<br /> I2C_SR_DATA_ACK= 0x80,<br /> I2C_SR_DATA_NACK= 0x88,<br /> I2C_SR_GCALL_DATA_ACK= 0x90,<br /> I2C_SR_GCALL_DATA_NACK= 0x98,<br /> I2C_SR_STOP= 0xA0,<br />/* Misc */<br /> I2C_NO_INFO= 0xF8,<br /><br /> I2C_MT_ADDRH_ACK= 0x3a,//主发模式下得到从机高位EEPROM地址应答信号<br /> I2C_MT_ADDRL_ACK= 0x3b,//主发模式下得到从机高低位EEPROM地址应答信号<br /> I2C_MR_DATA= 0x5a,//主收模式下接收数据<br /> I2C_MR_DATA_EN= 0x5b,//主收模式下使能接收数据功能<br /> I2C_MR_DATA_STOP= 0x5c,//主收模式下接收数据完成<br /><br /> I2C_FAILED= 0xcc,//读写操作失败<br /> I2C_SUCCEEDED= 0x00,//读写操作成功<br /> I2C_RWBIT= 0,//<br /> I2C_READ= 1,//<br /> I2C_WRITE= 0//<br />};<br /><br /><br />#define TRIS_SCL1 _TRISG2 //SCL方向控制<br />#define TRIS_SDA1 _TRISG3 //SDA方向控制<br />#define ODC_SCL1 _ODG2 //SCL开漏控制<br />#define ODC_SDA1 _ODG3 //SDA开漏控制<br /><br />/*-----------------------------------------<br /> 写保护管脚定义,需要硬件的支持<br />------------------------------------------*/<br />#define TRIS_WP _TRISD0 //WP方向控制<br />#define WP _LATD0//写保护<br /><br />typedef struct tagI2CBITS<br />{ <br /> union<br /> {<br /> unsigned char I2CFlag;<br /> struct<br /> {<br /> unsigned char BusyFlag: 1;//忙标志<br /> unsigned char ReadFlag: 1;//读回调标志<br /> unsigned char WriteFlag: 1;//写回调标志<br /> };<br /> };<br />}I2CBITS;<br /><br />extern volatile I2CBITS I2CBits;<br /><br />typedef struct tagI2CREGS<br />{ <br /> unsigned char State;//运行状态编码<br /> unsigned char I2CAddr;//器件地址0xa1,0xa0<br /> unsigned int RWAddr;//器件读写地址(自动根据MaxCount判断长短地址)<br /> unsigned int Count;//运行计数器<br /> unsigned int TxCount;//发送(写)个数<br /> unsigned int RxCount;//接收(读)个数<br /> unsigned int MaxCount;//器件最大容量<br /> unsigned char TxBuffer[16];//发送缓冲区<br /> unsigned char RxBuffer[256];//接收缓冲区<br />}I2CREGS;<br /><br />extern volatile I2CREGS I2CRegs;<br /><br /><br />void I2cInit(void);<br />void I2CReadBuffers(unsigned int, unsigned int);<br />void I2CReadByte(unsigned int);<br />void I2CWriteBuffers(unsigned int, unsigned int);<br />void I2CWriteByte(unsigned int, unsigned char);<br />void I2CReadCallBack(void);<br />void I2CWriteCallBack(void);<br />void I2cStart(void);<br />void I2cReStart(void);<br />void I2cStop(void);<br />void I2CExec(void);<br /><br />#endif//__I2C_H<br />
|