标题 I2C标准协议
调试模块时,经常会用到I2C,每次使用都需要重新整理代码,很是麻烦,于是整理了一份公用代码,之后不管什么平台,移植使用时只需修改宏定义就可以了;
如果对你有帮助,请给个赞!!!
#define I2C_IO_SDA (GPIO_0)
#define I2C_IO_SCL (GPIO_1)
#define I2C_SCL_OUT gpio_setDir(I2C_IO_SCL, GPIO_DIR_OUTPUT)
#define I2C_SCL_IN gpio_setDir(I2C_IO_SCL, GPIO_DIR_INPUT)
#define I2C_SCL_HIGH gpio_setPin(I2C_IO_SCL)
#define I2C_SCL_LOW gpio_clearPin(I2C_IO_SCL)
#define I2C_SDA_OUT gpio_setDir(I2C_IO_SDA, GPIO_DIR_OUTPUT)
#define I2C_SDA_IN gpio_setDir(I2C_IO_SDA, GPIO_DIR_INPUT)
#define I2C_SDA_HIGH gpio_setPin(I2C_IO_SDA)
#define I2C_SDA_LOW gpio_clearPin(I2C_IO_SDA)
#define I2C_SDA_DETECT gpio_getPin(I2C_IO_SDA)
#define I2C_DELAY Delay_DelayUs(5)
#define I2C_DELAY_LONG Delay_DelayUs(20)
#define I2C_DELAY_MS(x) Delay_DelayMs(x)
#define SLAVE_ADDRESS (0x7c)
#define ERROR_CODE_TRUE 0
#define ERROR_CODE_FALSE 1
void function_i2c_start(void)
{
I2C_SDA_HIGH;
I2C_DELAY;
I2C_DELAY;
I2C_SCL_HIGH;
I2C_DELAY;
I2C_DELAY;
I2C_SDA_LOW;
I2C_DELAY;
I2C_SCL_LOW;
I2C_DELAY;
}
void function_i2c_stop(void)
{
I2C_SDA_LOW;
I2C_DELAY;
I2C_SCL_HIGH;
I2C_DELAY;
I2C_SDA_HIGH;
I2C_DELAY_LONG;
}
unsigned char function_i2c_ack_detect(void)
{
I2C_SDA_HIGH;
I2C_DELAY;
I2C_SDA_IN; // SDA Input Mode
I2C_SCL_HIGH;
I2C_DELAY_LONG;//Jason
I2C_DELAY_LONG;
if (I2C_SDA_DETECT)
{
I2C_SDA_OUT;
return ERROR_CODE_FALSE; // false
}
I2C_DELAY;
I2C_SCL_LOW;
I2C_DELAY;
I2C_SDA_OUT;
return ERROR_CODE_TRUE; // true
}
void function_i2c_ack_send(void)
{
I2C_SDA_LOW;
I2C_DELAY;
I2C_SCL_HIGH;
I2C_DELAY;
I2C_SCL_LOW;
I2C_DELAY;
}
unsigned char function_i2c_write_byte(unsigned char data)
{
unsigned char i;
I2C_DELAY;
for(i = 0; i< 8; i++)
{
if( (data << i) & 0x80) I2C_SDA_HIGH;
else I2C_SDA_LOW;
I2C_DELAY;
I2C_SCL_HIGH;
I2C_DELAY;
I2C_SCL_LOW;
I2C_DELAY;
}
if(function_i2c_ack_detect())
{
return ERROR_CODE_FALSE;
}
return ERROR_CODE_TRUE;
}
unsigned char function_i2c_read_byte(void)
{
unsigned char i, data;
data = 0;
//I2C_SDA_HIGH;
I2C_DELAY;
I2C_SDA_IN;
for(i = 0; i< 8; i++)
{
data <<= 1;
I2C_DELAY;
I2C_SCL_HIGH;
I2C_DELAY_LONG;
I2C_DELAY_LONG;
if (I2C_SDA_DETECT)
data |= 0x01;
I2C_SCL_LOW;
I2C_DELAY;
}
I2C_SDA_OUT;
function_i2c_ack_send();
return data;
}
//此处是往从设备的addr地址写入一个byte,对模块做初始化的时候这个通讯协议用得最多
void device_i2c_write_byte(unsigned char addr, unsigned char value)
{
//以下6行是io口初始化,移植时需根据平台修改
gpio_setDir(I2C_IO_SDA, GPIO_DIR_OUTPUT);
gpio_setDir(I2C_IO_SCL, GPIO_DIR_OUTPUT);
gpio_setPin(I2C_IO_SDA);
gpio_setPin(I2C_IO_SCL);
gpio_pullSet(I2C_IO_SDA);
gpio_pullSet(I2C_IO_SCL);
function_i2c_start();
if(function_i2c_write_byte(SLAVE_ADDRESS))
{
printc("I2C Write Slave Address err -0 \r\n");
function_i2c_stop();
return;
}
if(function_i2c_write_byte((unsigned char)addr))
{
printc("I2C Write Slave Address err -1 \r\n");
function_i2c_stop();
return;
}
if(function_i2c_write_byte((unsigned char)value))
{
printc("I2C Write Slave Address err -2 \r\n");
function_i2c_stop();
return;
}
function_i2c_stop();
}