通过IIC通讯,pin8脚位。
![](https://i-blog.csdnimg.cn/blog_migrate/998ab32922d51d660a5abff8621ecc52.png)
以字节为单位,单次写入或者读取1个字节,存放到定义好的寄存器中,先定义所需寄存器
//读一个byte
R_READ_BYTE EQU 0X10
//读到的数据存放
R_RF_REC_1 EQU 0X11
R_RF_REC_2 EQU 0X12
R_RF_REC_3 EQU 0X13
//写入的数据中继
R_WRITE_BYTE EQU 0X14
定义与之相连的IO,
#DEFINE I2C_SCL GPIOA,10
#DEFINE I2C_SDA GPIOA,11
读取写入都需要确定一个器件地址和数据地址,器件地址取决于24C02的E0 E1 E2
EEPROM_READ:
LCALL I2C_WRITE_START
;器件地址
MOVIA 0XA0
MOVAR R_WRITE_BYTE
LCALL I2C_WRITE1BYTE
;起始地址
MOVIA 0XA5
MOVAR R_WRITE_BYTE
LCALL I2C_WRITE1BYTE
LCALL I2C_WRITE_START
;数据1
MOVIA 0XA1
MOVAR R_WRITE_BYTE
LCALL I2C_WRITE1BYTE
CLRWDT //清看门狗
CLRR R_ACK
LCALL I2C_READ1BYTE
MOVR R_READ_BYTE, TO_A
MOVAR R_EEPROM_CHECK
;读到的数据1
LCALL I2C_READ1BYTE
MOVR R_READ_BYTE, TO_A
MOVAR R_RF_REC_1
;读到的数据2
LCALL I2C_READ1BYTE
MOVR R_READ_BYTE, TO_A
MOVAR R_RF_REC_2
MOVIA 1
MOVAR R_ACK
;读到的数据3
LCALL I2C_READ1BYTE
MOVR R_READ_BYTE, TO_A
MOVAR R_RF_REC_3
;数据停止位
LCALL I2C_WRITE_STOP
RET
将0X123456存进0xA5地址,
EEPROM_WRITE:
LCALL I2C_WRITE_START
;器件地址
MOVIA 0XA0
MOVAR R_WRITE_BYTE
LCALL I2C_WRITE1BYTE
;起始地址
MOVIA 0XA5
MOVAR R_WRITE_BYTE
;
LCALL I2C_WRITE1BYTE ;check—bit
MOVIA 0X05
MOVAR R_WRITE_BYTE
;写进去的数据1
LCALL I2C_WRITE1BYTE
MOVIA 0X12
MOVAR R_WRITE_BYTE
;写进去的数据2
LCALL I2C_WRITE1BYTE
MOVIA 0X34
MOVAR R_WRITE_BYTE
;写进去的数据3
LCALL I2C_WRITE1BYTE
MOVIA 0X56
MOVAR R_WRITE_BYTE
LCALL I2C_WRITE1BYTE
;数据停止位
LCALL I2C_WRITE_STOP
RET
启停函数
I2C_WRITE_START:
BSR I2C_SDA
BSR I2C_SCL
LCALL I2C_WAIT_DELAY
BCR I2C_SDA
LCALL I2C_WAIT_DELAY
BCR I2C_SCL
LCALL I2C_WAIT_DELAY
RET
I2C_WRITE_STOP:
BCR I2C_SDA
BSR I2C_SCL
LCALL I2C_WAIT_DELAY
BSR I2C_SDA
LCALL I2C_WAIT_DELAY
RET
IIC协议ack应答信号为低有效,
![](https://i-blog.csdnimg.cn/blog_migrate/b772caa78891addcc3f1ffe64a87fa8e.png)
I2C_WRITE1BYTE:
MOVIA 8
MOVAR R_CYCLE_CNT
I2C_WRITE1BYTE_LOOP:
BCR I2C_SCL
RLR R_WRITE_BYTE, TO_R
BTRSC STATUS, C_B
BSR I2C_SDA
BTRSS STATUS, C_B
BCR I2C_SDA
LCALL I2C_WAIT_DELAY
BSR I2C_SCL
LCALL I2C_WAIT_DELAY
DECR R_CYCLE_CNT, TO_R
BTRSS STATUS, Z_B
LGOTO I2C_WRITE1BYTE_LOOP
BCR I2C_SCL
LCALL I2C_SDA_IN //SDA配置切换到输入
LCALL I2C_WAIT_DELAY
BSR I2C_SCL
LCALL I2C_WAIT_DELAY
BCR I2C_SCL
LCALL I2C_SDA_OUT //SDA配置切换到输出
RET
I2C_READ1BYTE:
CLRR R_READ_BYTE
BCR I2C_SCL
BSR I2C_SDA
LCALL I2C_SDA_IN //SDA配置切换到输入
LCALL I2C_WAIT_DELAY
MOVIA 8
MOVAR R_CYCLE_CNT
I2C_READ1BYTE_LOOP:
LCALL I2C_WAIT_DELAY
BSR I2C_SCL
BCR STATUS, C_B
RLR R_READ_BYTE, TO_R
BTRSC I2C_SDA
BSR R_READ_BYTE, 0
LCALL I2C_WAIT_DELAY
BCR I2C_SCL
DECR R_CYCLE_CNT, TO_R
BTRSS STATUS, Z_B
LGOTO I2C_READ1BYTE_LOOP
LCALL I2C_SDA_OUT //SDA配置切换到输出
MOVR R_ACK, TO_A
BTRSS STATUS, Z_B
BSR I2C_SDA
BTRSC STATUS, Z_B
BCR I2C_SDA
LCALL I2C_WAIT_DELAY
BSR I2C_SCL
LCALL I2C_WAIT_DELAY
BCR I2C_SCL
RET