📄 iic.h
字号:
/*********************************************************************/
/* IIC读写程序芯片型号*/
/*********************************************************************/
/*********************************************************************/
#include <C8051F310.h>
#include <intrins.h>
sbit I2C_SCK=P1^5; /*实时时钟时钟线引脚 */
sbit I2C_SDA=P1^4; /*实时时钟数据线引脚 */
/*********************************************************************/
#define ATIIcxxDriverAddressW 0xC0
#define ATIIcxxDriverAddressR 0xC1
#define _Nop() _nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_() /*定义空指令*/
/*********************************************************************/
struct bytedata_2
{
unsigned char ByteH;
unsigned char ByteL;
};
union int2byte
{
unsigned int IntData;
struct bytedata_2 ByteData;
};
/*********************************************************************/
//启动I2C总线,退出时SCL为低
void I2C_Start(void)
{
I2C_SDA=1; /*发送起始条件的数据信号*/
_Nop();
I2C_SCK=1;
_Nop(); /*起始条件建立时间大于4.7us,延时*/
_Nop();
_Nop();
_Nop();
_Nop();
I2C_SDA=0; /*发送起始信号*/
_Nop(); /* 起始条件锁定时间大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
I2C_SCK=0; /*钳住I2C总线,准备发送或接收数据 */
}
//*停止I2C总线
void I2C_Stop(void)
{
I2C_SCK=0;
I2C_SDA=0; /*发送结束条件的数据信号*/
_Nop(); /*发送结束条件的时钟信号*/
I2C_SCK=1; /*结束条件建立时间大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
I2C_SDA=1; /*发送I2C总线结束信号*/
}
//MCU等待应答位(返回0表示应答)
bit I2C_WaitAck(void)
{
unsigned char ucErrTime = 800; //因故障接收方无ACK,超时值。
I2C_SCK=0;
I2C_SDA=1;
_Nop();
I2C_SCK=1;
_Nop();
while(I2C_SDA)
{
ucErrTime--;
if (ucErrTime == 0)
{
I2C_Stop();
return 0;
}
}
I2C_SCK=0;
return 1;
}
//MCU应答信号
void I2C_Ack(void)
{
I2C_SCK=0;
I2C_SDA=0;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
I2C_SCK=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
I2C_SCK=0;
}
//MCU发送非应答信号
void I2C_Noack(void)
{
I2C_SCK=0;
I2C_SDA=1;
_Nop();
_Nop();
I2C_SCK=1;
_Nop();
_Nop();
I2C_SCK=0;
}
void I2C_Send_Byte(unsigned char sendbyte)
{
unsigned char i = 8;
while( i-- )
{
I2C_SCK = 0;
_Nop(); //_Nop();
if ( sendbyte &0x80 ) I2C_SDA =1;
else I2C_SDA =0;
_Nop(); //_Nop();
I2C_SCK = 1;
_Nop(); //_Nop();
sendbyte <<= 1;
}
I2C_WaitAck();
}
static unsigned char I2C_Receive_Byte(void)
{
unsigned char i = 8, data_buffer;
I2C_SDA = 1;
while ( i--)
{
I2C_SCK =0;
_Nop();_Nop();
I2C_SCK =1;
_Nop();_Nop();
data_buffer <<= 1;
if ( I2C_SDA ) data_buffer++;
}
return (data_buffer);
}
void ATIICxx_PWrite(unsigned char *McuAddress,unsigned char count)
{
I2C_Start();
I2C_Send_Byte( ATIIcxxDriverAddressW );
_Nop();_Nop();
while(count--)
{
I2C_Send_Byte( *(unsigned char*)McuAddress );
((unsigned char*)McuAddress)++;
_Nop();_Nop();
}
_Nop();
I2C_Stop();
_Nop();
}
void ATIICxx_PRead(unsigned char *McuAddress,unsigned char count)
{
I2C_Start();
I2C_Send_Byte( ATIIcxxDriverAddressR );
//_Nop();_Nop();
while(count--)
{
*McuAddress = I2C_Receive_Byte();
I2C_Ack();
McuAddress++;
//_Nop();_Nop();
}
//_Nop();
I2C_Noack();
I2C_Stop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -