📄 i2c_intf.c
字号:
//********************************************************************************************//********************************************************************************************//*************************** Firmware for ANX9021 ***********************************//********************************************************************************************//********************************************************************************************//******************************************************************************// ANALOGIX Company // ANX9021 Firmware on AT89C51RC clean for customer// Version 1.51 2006/04/27//******************************************************************************#include <stdio.h>#include "i2c_intf.h"void print_byte(char *s, unsigned char b);#define NOP_DELAY do { _NOP_; _NOP_; } while (0)#define SCL_PULSE do { SCL_P = 1; NOP_DELAY; SCL_P = 0; NOP_DELAY; } while (0)unsigned char i2c_dev_addr;void i2c_init(void){ SDA_P = 1; SCL_P = 1;}void i2c_send_start_bit(void){ SDA_P = 0; NOP_DELAY; SCL_P = 0; NOP_DELAY;}void i2c_send_restart_bit(void){ SDA_P = 1; NOP_DELAY; SCL_P = 1; NOP_DELAY; SDA_P = 0; NOP_DELAY; SCL_P = 0; NOP_DELAY;}void i2c_send_stop_bit(void){ SDA_P = 0; NOP_DELAY; SCL_P = 1; NOP_DELAY; SDA_P = 1; NOP_DELAY;}void i2c_send_byte(unsigned char b){ unsigned char i; for (i=0; i<8; i++) { ACC = b; SDA_P = ACC_7; SCL_PULSE; b = b << 1; }}unsigned char i2c_read_byte(void){ unsigned char c, i; SDA_P = 1; for (i=0; i<8; i++) { SCL_P = 1; NOP_DELAY; ACC = c; ACC = ACC << 1; ACC_0 = SDA_P; c = ACC; SCL_P = 0; NOP_DELAY; } return c;}char i2c_read_ack(void){ char result; SDA_P = 1; NOP_DELAY; SCL_P = 1; NOP_DELAY; result = SDA_P; SCL_P = 0; NOP_DELAY; SDA_P = 1; NOP_DELAY; return result;}void i2c_send_ack(char ack){ SDA_P = ack; NOP_DELAY; SCL_P = 1; NOP_DELAY; SCL_P = 0; NOP_DELAY; SDA_P = 1; NOP_DELAY;}char i2c_write_reg(unsigned char offset, unsigned char d){ i2c_send_start_bit(); i2c_send_byte(i2c_dev_addr); if (i2c_read_ack()) { i2c_send_stop_bit(); return 1; // no device acknowledge } i2c_send_byte(offset); if (i2c_read_ack()) { i2c_send_stop_bit(); return 2; // device no accept the data, terminate transfer } i2c_send_byte(d); i2c_read_ack(); i2c_send_stop_bit(); return 0;}char i2c_write_p0_reg(unsigned char offset, unsigned char d){ i2c_dev_addr = PORT0_ADDR; return i2c_write_reg(offset, d);}char i2c_write_p1_reg(unsigned char offset, unsigned char d){ i2c_dev_addr = PORT1_ADDR; return i2c_write_reg(offset, d);}char i2c_read_reg(unsigned char offset, unsigned char *d){ i2c_send_start_bit(); i2c_send_byte(i2c_dev_addr); if (i2c_read_ack()) { i2c_send_stop_bit(); return 1; // no device acknowledge } i2c_send_byte(offset); if (i2c_read_ack()) { i2c_send_stop_bit(); return 2; // device no accept the data, terminate transfer } i2c_send_restart_bit(); i2c_send_byte(i2c_dev_addr | 0x01); if (i2c_read_ack()) return 1; // no device acknowledge *d = i2c_read_byte(); i2c_send_ack(1); i2c_send_stop_bit(); return 0;}char i2c_read_p0_reg(unsigned char offset, unsigned char *d){ i2c_dev_addr = PORT0_ADDR; return i2c_read_reg(offset, d);}char i2c_read_p1_reg(unsigned char offset, unsigned char *d){ i2c_dev_addr = PORT1_ADDR; return i2c_read_reg(offset, d);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -