📄 i2c.h
字号:
/**************** Video Codec Head File ****************/
#ifndef __I2C_H__
#define __I2C_H__
/**************** Function declare ********************/
void CPU_I2C_Start(void);
void I2C_Init ( void );
void I2C_S_Start ( void );
void I2C_Stop ( void );
void I2C_Ack ( void );
void Test_Ack( void );
void Set_I2C_P2S ( unsigned char );
void Write_I2C_1Byte ( unsigned char, unsigned char, unsigned char );
unsigned char Get_I2C_S2P ( void );
unsigned char Read_I2C_1Byte ( unsigned char, unsigned char );
unsigned char Read_I2Cs_1Byte ( unsigned char, unsigned char );
void Write_I2C_nByte ( unsigned char, unsigned char, unsigned char code *, unsigned char );
//==================================================================================
//==================================================================================
// I2C function description
//==================================================================================
void short_delay(int n)
{
for(;n>0;n--);
}
//==================================================================================
void I2C_Init ( void )
{
ATP_SDA = 1;
ATP_SCL = 1;
}
//==================================================================================
void I2C_S_Start ( void )
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//保证启动和停止之间的空闲时间
// ATP_SDA = 1;
// ATP_SCL = 1;
ATP_SDA = 0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//起始条件保持时间
ATP_SCL = 0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//保证SCL的低电平时间
}
//==================================================================================
void I2C_Sr_Start ( void )
{
ATP_SCL = 1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//重复起始条件建立时间
ATP_SDA = 0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//起始条件保持时间
ATP_SCL = 0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//保证SCL的低电平时间
}
//==================================================================================
void I2C_Stop ( void )
{
ATP_SDA = 0;
_nop_();_nop_();
ATP_SCL = 1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//停止条件建立时间
ATP_SDA = 1;
_nop_();_nop_();
}
//==================================================================================
void I2C_Ack ( void )
{
ATP_SDA = 1; //... SDA input mode
_nop_();_nop_();_nop_();_nop_();_nop_();//数据建立时间
ATP_SCL = 1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//scl高电平时间
ATP_SCL = 0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//保持时间
}
//==================================================================================
void Test_Ack() //测试ACK信号
{
// bit ErrorBit;
// ATP_SDA = 1;
_nop_();_nop_();_nop_();_nop_();//数据建立时间
ATP_SCL = 1;
_nop_();_nop_();_nop_();_nop_();
// ErrorBit=ATP_SDA;
while(ATP_SDA);
_nop_();_nop_();_nop_();_nop_();//scl高电平时间
ATP_SCL = 0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//保持时间
// return(ErrorBit); //若SDA=1,说明尚未处理完
//return(0);
return;
}
//==================================================================================
void Set_I2C_P2S ( unsigned char wdata )
{
unsigned char i;
/* MSB is sent first */
for ( i = 0; i < 8; i ++ )
{
( wdata & 0x80 ) ? ( ATP_SDA = 1 ) : ( ATP_SDA = 0 );
_nop_();_nop_();_nop_();_nop_(); //数据建立时间
ATP_SCL = 1;
wdata <<=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//SCL高电平时间
ATP_SCL = 0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//数据保持时间
}
ATP_SDA = 1;
}
//==================================================================================
unsigned char Get_I2C_S2P ( void )
{
unsigned char i, rdata = 0;
ATP_SDA = 1; // ... SDA input mode
for ( i = 1; i <= 8; i ++ )
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//数据建立时间
ATP_SCL = 1;
_nop_();_nop_();_nop_();_nop_();
if ( ATP_SDA == 1 ) rdata |= 0x01;
_nop_();_nop_();
ATP_SCL = 0;
_nop_();_nop_();_nop_();_nop_();_nop_();//数据保持时间
if ( i == 8 ) continue; //
rdata <<= 1;
}
return rdata;
}
//==================================================================================
void Write_I2C_1Byte ( unsigned char slave_addr, unsigned char start_addr, unsigned char wdata )
{
I2C_S_Start ( );
Set_I2C_P2S ( slave_addr << 1 ); // I2C write mode
Test_Ack ( );
Set_I2C_P2S ( start_addr );
Test_Ack ( );
Set_I2C_P2S ( wdata );
Test_Ack ( );
I2C_Stop ( );
}
//==================================================================================
void Write_I2C_nByte ( unsigned char slave_addr, unsigned char start_addr, unsigned char code *tbl_ptr, unsigned char length )
{
unsigned char count;
I2C_S_Start ( );
Set_I2C_P2S ( slave_addr << 1 ); // I2C write mode
Test_Ack ( );
Set_I2C_P2S ( start_addr );
Test_Ack ( );
for ( count = 0; count < length; count ++ )
{
Set_I2C_P2S ( tbl_ptr [ count ] );
Test_Ack ( );
}
I2C_Stop ( );
}
//==================================================================================
unsigned char Read_I2C_1Byte ( unsigned char slave_addr, unsigned char start_addr )
{
unsigned char rdata = 0;
I2C_S_Start ( );
Set_I2C_P2S ( slave_addr << 1 ); // I2C write mode
Test_Ack ( );
Set_I2C_P2S ( start_addr );
Test_Ack ( );
I2C_Stop ( );
I2C_Sr_Start ( ); // write -> read
Set_I2C_P2S ( ( slave_addr << 1 ) | 0x01 ); // I2C read mode
Test_Ack ( );
rdata = Get_I2C_S2P ( );
I2C_Ack ( );
I2C_Stop ( );
return rdata;
}
//==================================================================================
unsigned char Read_I2Cs_1Byte ( unsigned char slave_addr, unsigned char start_addr )
{
unsigned char rdata = 0;
I2C_S_Start ( );
Set_I2C_P2S ( ( slave_addr << 1 ) | 0x01 ); // I2C read mode
Test_Ack ( );
Set_I2C_P2S ( start_addr );
Test_Ack ( );
rdata = Get_I2C_S2P ( );
ATP_SDA = 1; //... SDA input mode
ATP_SCL = 1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
I2C_Stop ( );
return rdata;
}
//==================================================================================
void CPU_I2C_Start(void)
{
I2C_S_Start();
Set_I2C_P2S(0x1);
Test_Ack ( );
I2C_Sr_Start();
}
//==================================================================================
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -