📄 i2c.c
字号:
#include "reg52.h"
#include "Config.h"
#include "IOPort.h"
#include "tools.h"
#include "i2c.h"
#define I2C_Retries 5
#define I2C_SDA_LOW P_I2C_SDA=0
#define I2C_SDA_HIGH P_I2C_SDA=1
#define I2C_SCL_LOW P_I2C_SCL=0
#define I2C_SCL_HIGH P_I2C_SCL=1
#define I2C_SDA_IN P_I2C_SDA
#define I2C_DELAY I2cDelay()
unsigned char idata I2C_buffer[I2C_MAXNUM];
void I2cDelay()
{
delay_us(5);
}
void I2C_STOP (void)
{
I2C_SDA_LOW;
I2C_DELAY;
I2C_SCL_HIGH;
I2C_DELAY;
I2C_SDA_HIGH;
I2C_DELAY;
}
I2C_RETURN I2C_START (void)
{
unsigned char i;
I2C_SCL_HIGH;
I2C_SDA_HIGH;
I2C_DELAY;
if (I2C_SDA_IN)
{
I2C_SDA_LOW;
I2C_DELAY;
I2C_SCL_LOW;
I2C_DELAY;
return I2C_SUCCESS;
}
else {
/*DATA is locked, so unlock it*/
I2C_SCL_LOW;
I2C_DELAY;
for (i=0; i<9; i++)
{
I2C_SCL_HIGH;
I2C_DELAY;
I2C_SCL_LOW;
}
I2C_STOP ();
return I2C_ERROR;
}
}
/*entry: assumed that clk is low*/
I2C_RETURN I2C_write_byte (unsigned char b)
{
unsigned char i;
I2C_DELAY;
I2C_SDA_HIGH;
for (i=0; i<8; i++)
{
if (b&0x80) {
I2C_SDA_HIGH;
}
else {
I2C_SDA_LOW;
}
I2C_DELAY;
I2C_SCL_HIGH;
I2C_DELAY;
I2C_SCL_LOW;
I2C_DELAY;
b <<= 1;
}
I2C_SDA_HIGH;
I2C_DELAY;
I2C_SCL_HIGH;
I2C_DELAY;
if (I2C_SDA_IN) {
I2C_SCL_LOW;
I2C_DELAY;
I2C_STOP ();
return I2C_ERROR;
}
else {
I2C_SCL_LOW;
I2C_DELAY;
return I2C_SUCCESS;
}
}
/*entry: assumed that clk is low*/
unsigned char I2C_read_byte (void)
{
unsigned char i;
unsigned char b=0;
I2C_SDA_HIGH;
I2C_SCL_LOW;
for (i=0; i<8; i++) {
b <<= 1;
I2C_DELAY;
I2C_SCL_HIGH;
if (I2C_SDA_IN)
b |=0x01;
I2C_DELAY;
I2C_SCL_LOW;
}
I2C_DELAY;
I2C_SDA_LOW;
I2C_DELAY;
I2C_SCL_HIGH;
I2C_DELAY;
I2C_SCL_LOW;
I2C_DELAY;
I2C_SDA_HIGH;
return b;
}
unsigned char I2C_read_last_byte (void)
{
unsigned char i;
unsigned char b=0;
I2C_SDA_HIGH;
I2C_SCL_LOW;
for (i=0; i<8; i++) {
b <<= 1;
I2C_DELAY;
I2C_SCL_HIGH;
if (I2C_SDA_IN)
b |= 0x01;
I2C_DELAY;
I2C_SCL_LOW;
}
I2C_DELAY;
I2C_SDA_HIGH;
I2C_DELAY;
I2C_SCL_HIGH;
I2C_DELAY;
I2C_SCL_LOW;
I2C_DELAY;
return b;
}
void I2C_write (unsigned char device_addr,unsigned char *buf,unsigned char num)
{
unsigned char i,num_error = 0;
I2C_RETURN r;
do {
r = I2C_START();
if (r == I2C_SUCCESS)
{
r = I2C_write_byte (device_addr);
}
for (i=0; i<num; i++)
{
if (r == I2C_SUCCESS)
{
r = I2C_write_byte (*buf++);
}
}
if (r == I2C_SUCCESS)
{
I2C_STOP();
}
} while ( (r != I2C_SUCCESS) && (num_error++ < I2C_Retries));
delay_ms(5);
}
void I2C_write_sub (unsigned char device_addr,unsigned char sub_addr,unsigned char *buf,unsigned char num)
{
unsigned char i,num_error = 0;
I2C_RETURN r;
do {
r = I2C_START();
if (r == I2C_SUCCESS)
{
r = I2C_write_byte (device_addr);
}
if (r == I2C_SUCCESS)
{
r = I2C_write_byte (sub_addr);
}
for (i=0; i<num; i++)
{
if (r == I2C_SUCCESS)
{
r = I2C_write_byte (*buf++);
}
}
if (r == I2C_SUCCESS) {
I2C_STOP();
}
} while ( (r != I2C_SUCCESS) && (num_error++ < I2C_Retries));
delay_ms(5);
}
void I2C_read_sub (unsigned char device_addr,unsigned char sub_addr,unsigned char *buf,unsigned char num)
{
unsigned char i,num_error = 0;
I2C_RETURN r;
do {
r = I2C_START();
if (r == I2C_SUCCESS)
{
r = I2C_write_byte (device_addr);
}
if (r == I2C_SUCCESS)
{
r = I2C_write_byte (sub_addr);
}
if (r == I2C_SUCCESS)
{
I2C_STOP();
}
if (r == I2C_SUCCESS)
{
r = I2C_START();
}
if (r == I2C_SUCCESS)
{
r = I2C_write_byte (device_addr | 0x01);
}
if (num > 1)
{
for (i=0; i<num-1; i++)
{
*buf++ = I2C_read_byte ();
}
}
*buf = I2C_read_last_byte ();
if (r == I2C_SUCCESS) {
I2C_STOP();
}
} while ( (r != I2C_SUCCESS) && (num_error++ < I2C_Retries));
}
void I2C_read(unsigned char device_addr,unsigned char *buf,unsigned char num)
{
unsigned char i,num_error = 0;
I2C_RETURN r;
do {
r = I2C_START();
if (r == I2C_SUCCESS)
{
r = I2C_write_byte (device_addr);
}
if (r == I2C_SUCCESS)
{
I2C_STOP();
}
if (r == I2C_SUCCESS)
{
r = I2C_START();
}
if (r == I2C_SUCCESS)
{
r = I2C_write_byte (device_addr | 0x01);
}
if (num > 1)
{
for (i=0; i<num-1; i++)
{
*buf++ = I2C_read_byte ();
}
}
*buf = I2C_read_last_byte ();
if (r == I2C_SUCCESS) {
I2C_STOP();
}
} while ( (r != I2C_SUCCESS) && (num_error++ < I2C_Retries) );
//delay_ms(5);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -