如图, 用自带的I2C debugger看, 发送完数据后的状态都是N(nack), 设备无响应
I2C的启动, 发送, 停止都是正常的, 就是设备不响应, 是我代码的问题还是软件的问题?
设备是INA219, 电压电流监测模块
文档给的写数据时序图
文档的典型接法:
我知道一上来就贴代码让人很没有读的欲望, 但我真的排查不出问题,恳请各位帮忙!
51模拟I2C总线的部分
- void IIC_ack(){
- uchar i;
- SCLK = 0; //时钟线置低
- SDA = 1; //拉高SDA
- delay_us(); //延时, 等待SDA被从机拉低
- SCLK = 1; //拉高时钟线
- while((SDA == 1) && (i < 255)){
- i++; //延时, 继续等待
- }
- SCLK = 0; //拉低时钟线
- delay_us();
- }
- void IIC_sentByte(uchar _data){
- uchar i, temp;
- temp = _data;
- for(i = 0; i < 8; i++){
- temp = temp << 1; //数据向左移, 左移溢出的一位到PSW寄存器的CY中
- SCLK = 0; //时钟线拉低
- delay_us();
- SDA = CY; //SDA发送CY中的一位数据
- SCLK = 1;
- delay_us();
- }
- SCLK = 0;
- delay_us();
- SDA = 1; //释放SDA
- delay_us();
- }
复制代码
Proteus仿真时读的代码
- #include <reg52.h>
- #include <intrins.h>
- #include "IIC_Protocol_for8051.h"
- #define uchar unsigned char
- #define uint unsigned int
-
- //当Slave address为1001010 (4AH)时, A1和A0地址线直接采样SDA上的数据
- //即 SDA上跑的数据就是A0, A1获取的数据
- void INA219_sent2Reg(uchar regAddress, uint _data){
- uchar data_MSB = _data / 256; //获取数据高八位
- uchar data_LSB = _data - (data_MSB * 256); //获取数据低八位
- IIC_init(); //I2C总线启动
- IIC_start();
- IIC_sentByte(0x94); //发送Slave address(前7位), 和R/#W位(确认传输方向, 第8位)
- //0x94 = 0x4A(Slave address) * 2 [在0x4A后加一个R/#W位]
- //0x94 = 10010100 0x4A = 1001010
- IIC_ack();
- IIC_sentByte(regAddress); //发送寄存器地址
- IIC_ack(); //并等待从机是否有Ack(响应)
- IIC_sentByte(data_MSB); //发送数据高8位
- IIC_ack();
- IIC_sentByte(data_LSB); //发送低8位
- IIC_ack();
- IIC_stop(); //I2C总线停止
- }
- void INA219_init(){
- INA219_sent2Reg(0x05, 0x1000); //0x1000是要发送的数据, 无特殊含义
- }
- void main(){
- INA219_init();
- while(1);
- }
复制代码
INA219.pdf
(1.31 MB, 下载次数: 6)
|