4000-520-616
欢迎来到免疫在线!(蚂蚁淘生物旗下平台)  请登录 |  免费注册 |  询价篮
主营:原厂直采,平行进口,授权代理(蚂蚁淘为您服务)
咨询热线电话
4000-520-616
当前位置: 首页 > 新闻动态 >
热卖商品
新闻详情
单片机scl和sda接口 - CSDN
来自 : CSDN技术社区 发布时间:2021-03-25

2)读一个字函数:u16 lc709203f_ReadOneWord(u8 ReadAddr),严格按照上述协议中的时许写代码

u16 lc709203f_ReadOneWord(u8 ReadAddr) u16 data=0;  u8 data_l=0;  u8 data_h=0; u8 crc_8=0; u8 readcrc[5]; IIC2_Start(); //第一步:第一次启动 delay_us(100); IIC2_Send_Byte(LC709203F_ADDR_wr); //第二步:写入从机地址和写入指令 delay_us(100); IIC2_Wait_Ack(); //第三步:等待从机确认 delay_us(100); IIC2_Send_Byte(ReadAddr); //第四步:发送寄存器地址(字节最高位为虚拟位) delay_us(100); IIC2_Wait_Ack(); //第五步:等待从机确认 delay_us(100); IIC2_Start(); //第六步:第二次启动  delay_us(100); IIC2_Send_Byte(LC709203F_ADDR_rd); //第七步:写入从机地址和读取指令  delay_us(100);  IIC2_Wait_Ack(); //第八步:等待从机确认 delay_us(100); data_l=IIC2_Read_Byte(1); //第九步:接收低字节数据 delay_us(100); //IIC2_Ack(); //产生应答1 data_h=IIC2_Read_Byte(1); //第十步:接收高字节数据 delay_us(100); //IIC2_Ack(); //产生应答2 crc_8=IIC2_Read_Byte(0); //第十一步:接收CRC-8数据 delay_us(100); //IIC2_NAck(); //不产生应答 IIC2_Stop(); //第十二步:停止 readcrc[0]=LC709203F_ADDR_wr; readcrc[1]=ReadAddr; readcrc[2]=LC709203F_ADDR_rd; readcrc[3]=data_l; readcrc[4]=data_h; if(gh_crc8(readcrc,5)==crc_8) data=data_h*256+data_l; return data;}

3)写一个字函数:void lc709203f_WriteOneWord(u8 WriteAddr,u16 DataToWrite)

void lc709203f_WriteOneWord(u8 WriteAddr,u16 DataToWrite){                                                                                                      u8 data[4];    IIC2_Start();                              //第一步:启动    IIC2_Send_Byte(LC709203F_ADDR_wr); //第二步:写入从机地址和写入指令    IIC2_Wait_Ack();                              //第三步:等待从机确认    IIC2_Send_Byte(WriteAddr);                 //第四步:发送寄存器地址(字节最高位为虚拟位)    IIC2_Wait_Ack();                            //第五步:等待从机确认                                     IIC2_Send_Byte((u8)(DataToWrite 0x00FF));               //第六步:发送低字节数据                                   IIC2_Wait_Ack();                            //第七步:等待从机确认    IIC2_Send_Byte((u8)(DataToWrite 8));      //第八步:发送高字节数据        IIC2_Wait_Ack();                            //第九步:等待从机确认    data[0]=LC709203F_ADDR_wr;    data[1]=WriteAddr;    data[2]=(u8)(DataToWrite 0x00FF);    data[3]=(u8)(DataToWrite 8);    IIC2_Send_Byte(gh_crc8(data,4));      //第十步:发送CRC-8数据        IIC2_Wait_Ack();                            //第十一步:等待从机确认    IIC2_Stop();                               //第十二步:停止    delay_ms(10);     }

4)获取数据函数:void getLC709203FOutput(s16* LC709203FData)

void getLC709203FOutput(s16* LC709203FData) u16 data0,data1,data2; data0=lc709203f_ReadOneWord(LC709203F_Cell_Temperature);//电池温度 data1=lc709203f_ReadOneWord(LC709203F_RSOC);//电池剩余电量 data2=lc709203f_ReadOneWord(LC709203F_Cell_Voltage); //电池电压 if((data0 =0x0AAC) (data0 =0x7FFF)) //读取的数据处理 LC709203FData[0]=data0-0x0AAC; if(data1 =0x0064) LC709203FData[1]=data1; if((data2 =0x0FA0) (data2 =0x07D0)) LC709203FData[2]=data2;}

四、调试中遇到的问题处理总结

1、起初,未严格按照协议,读取到的数据均是0XABAB等,以为是I2C读写函数信号延时函数设置不合适的问题,后来多次测试还是不行,再后来仔细阅读协议,发现此协议还需要CRC8校验,比其他一些芯片的I2C通讯协议要复杂,于是按照通讯协议写lc709203f_ReadOneWord()和lc709203f_WriteOneWord()函数;

2、之后下载程序运行,仍然读不到正确数据,检查程序,发现lc709203f_ReadOneWord()中第九步、第十步、第十一步都是IIC2_Read_Byte(1),函数的形参都为1,而该函数1表示为产生应答ACK,0为不产生应答NACK,根据I2C通讯协议,应该为上面程序所写的,不产生应答的改为IIC2_Read_Byte(0),并且此函数里面已经有ACK和NACK函数,如上述程序所写的需要注释掉产生应答1、产生应答2和不产生应答。

IIC2_Read_Byte()如下:

//读1个字节,ack=1时,发送ACK,ack=0,发送nACK u8 IIC2_Read_Byte(unsigned char ack) unsigned char i,receive=0; SDA2_IN();//SDA设置为输入 for(i=0;i i++ ) IIC2_SCL=0;  delay_us(4); //LC709203F时钟频率400Khz=2.5us IIC2_SCL=1; receive =1; //receive=receive 1; if(READ2_SDA)receive++; // 根据READ_SDA的值(SDA),从高到低顺序依次写入一个字节, delay_us(4); //i=0时,SDA=1则receive=0B00000001,i=1,SDA=1则receive=0B00000011 if (!ack) IIC2_NAck();//发送nACK else IIC2_Ack(); //发送ACK  return receive;}

3、修改上述后,下载程序运行仍然读不到正确数据,但是通过单步调试都能正确读到数据,原因在哪里呢?单步调试发现写的数据均已写入进去了,于是在读字节函数lc709203f_ReadOneWord()中,在每一步之间增加delay_us(100);//延时100us,此时运行,都能正确读到数据。

收起 \"\" 展开全文 \"\"

本文链接: http://kbsda.immuno-online.com/view-743518.html

发布于 : 2021-03-25 阅读(0)
公司介绍
品牌分类
联络我们
服务热线:4000-520-616
(限工作日9:00-18:00)
QQ :1570468124
手机:18915418616
官网:http://