问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

为什么我的IIC从设备无法发送应答信号

发布网友 发布时间:2022-05-10 11:23

我来回答

1个回答

热心网友 时间:2023-10-08 20:01

只要IIC接口芯片未损坏,则主要问题就是SDA、SCL的时序问题。
以AT89C51+24C04驱动数码管为例:
(图片传不上)
#include <reg51.h>

#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define NOP4() {_nop_();_nop_();_nop_();_nop_();}

sbit SCL = P1^0; //时钟线
sbit SDA = P1^1; //数据线
sbit clear_K=P3^7;//清0键

uchar code DSY_CODE[]= //共阳数码显示编码
{
0xc0,0xf9,0xa4,0xb0,0x99, //0~4
0x92,0x82,0xf8,0x80,0x90, //5~9
0xff
};

uchar DISP_Buffer[]={0,0,0}; //显示缓存
uchar Count = 0; //全局变量:计数值

void DelayMS(uint x) //ms延时子函数
{
uchar t; //循环变量
while(x--) //循环x次
{
for(t=120;t>0;t--); //嵌套循环120次
}
}

void Start() //开启总线子程序
{
SDA=1;//拉高数据线电平
SCL=1;//拉高时钟线电平
NOP4(); //延时4个机器周期
SDA=0;//拉低数据线电平
NOP4();//延时4个机器周期
SCL=0; //拉低时钟线电平
}

void Stop() //释放总线子程序
{
SDA=0;//拉低数据线电平
SCL=0;//拉低时钟线电平
NOP4(); //延时4个机器周期
SCL=1;//拉高时钟线电平
NOP4();//延时4个机器周期
SDA=1; //拉高数据线电平
}

void RACK() //应答
{
SDA=1;//拉高数据线电平
NOP4();//延时4个机器周期
SCL=1;//拉高时钟线电平
NOP4(); //延时4个机器周期
SCL=0;//拉低时钟线电平
}

void NO_ACK() //无应答
{
SDA=1;//拉高数据线电平
SCL=1;//拉高时钟线电平
NOP4();//延时4个机器周期
SCL=0;//拉低时钟线电平
SDA=0;//拉低数据线电平
}

void Write_A_Byte(uchar b) //写入一个字节数据
{
uchar i; //循环变量
for(i=0;i<8;i++) //循环8次
{
b<<=1; //数据左移1位,最高位移入进位位
SDA=CY;_nop_();//将进位位数送总线数据线
SCL=1;NOP4();//拉高时钟线电平,将数据写入
SCL=0;//拉低时钟线
}
RACK();//应答
}

uchar Receive_A_Byte()//接收一个字节数据
{
uchar i,d;//定义循环变量,读数变量
for(i=0;i<8;i++)//循环8次
{
SCL=1;//拉高时钟线电平
d<<=1;//读数左移1位
d|=SDA;//并入串行数据(从高位到低位逐位加入)
SCL=0;//拉低时钟线
}
return d;//返回数据d(8位并行数据)
}

void Write_Random_Address_Byte(uchar add,uchar dat) //写随机地址字节
{
Start();//初始化总线
Write_A_Byte(0xa0);//发送命令控制字:写入地址数据
Write_A_Byte(add);//写入地址码
Write_A_Byte(dat);//写入数据码
Stop();//传送结束,释放总线
DelayMS(10);//延时10ms
}

uchar Read_Current_Address_Data()//读数据流
{
uchar d;//定义数据变量
Start();//初始化总线
Write_A_Byte(0xa1);//发送命令控制字:读取数据
d=Receive_A_Byte();//8位数据接收
NO_ACK();//无应答
Stop();//读取数据结束
return d;//返回d值
}

uchar Random_Read(uchar addr)//随机读取数据
{
Start();//初始化总线
Write_A_Byte(0xa0);//写入读取控制字
Write_A_Byte(addr);//写入字节地址
Stop();//释放总线
return Read_Current_Address_Data();//返回数据流数值
}

void Convert_And_Display()//转换并显示
{
DISP_Buffer[2]=Count/100;//显示缓存百位数
DISP_Buffer[1]=Count%100/10;//显示缓存十位数
DISP_Buffer[0]=Count%100%10;//显示缓存个位数
if(DISP_Buffer[2]==0)//如果百位数为0
{
DISP_Buffer[2]=10;//不显示百位数
if(DISP_Buffer[1]==0)//如果十位数也为0
{
DISP_Buffer[1]=10;//十位数也不显示
}
}
P2 = 0x80;//送显示位码:第8位数码管
P0 = DSY_CODE[DISP_Buffer[0]];//送显示段码:显示数个位
DelayMS(5);//延时5ms
P2=0x00;//消影
P2 = 0x40;//送显示位码:第7位数码管
P0 = DSY_CODE[DISP_Buffer[1]];//送显示段码:显示数十位
DelayMS(5);//延时5ms
P2=0x00;//消影
P2 = 0x20;//送显示位码:第6位数码管
P0 = DSY_CODE[DISP_Buffer[2]];//送显示段码:显示数百位
DelayMS(5);//延时5ms
P2=0x00; //消影
}

void main()//主程序
{
Count = Random_Read(0x00);//读取存储数值(上电或复位)
Count++;//计数值自加1
Write_Random_Address_Byte(0x00,Count);//计数值写入存储器
while(1)//无限循环
{
if(clear_K==0)//如果清0键被按下
{
DelayMS(10);//延时10ms,消抖动
if(clear_K==0)//确认清0键被按下
{
Count=0;//计数值归0,
//Count=100;//计数值调整为5
}
while(clear_K==0);//等待键松开
Write_Random_Address_Byte(0x00,Count); //重写存储器
}
else//否则
Convert_And_Display();//调用转换与显示程序
}
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
绿茶要猛冲吗,绿茶鲜嫩不需要(绿茶冲泡的正确方式) 绿茶为什么越好越不耐泡 绿茶要泡几泡?哪种绿茶最耐泡? 哪种绿茶最耐泡 职场故事:美女职员遇到暴躁老板 老板脾气坏得要命,我该怎么办 老板老爱发脾气,我们应该怎么做呀? 害怕老总发脾气怎么办 网络上用名字测和另一个人的关系准确吗 一个男生把自己的名字和另一个人的名字放在一起,中间放个"&amp;"符号... 空军一号white team orange game royal码子正吗 提供施耐德Twidosuite的PLC编程软件,要求必须中文版的。备注PLC型号是:Twdlcaa16DRF teamview安装不成功,然后在控制面板里面的卸载里又没有 xp系统能适合安装施耐德PLC编程软件吗? 施耐德编程软件不一样能通讯吗?厂家提供的是TWDLCAA16DRF的型号我原来有 软件是PL7的 请问能不能通讯上 team win recovery可以刷什么 施耐德TWDLCAA24RF型PLC用TWidosoft编程软件软件怎上传和下载程序么设置? a几。乙方几,。Ω、&#47;~η~小成一、,η乀、,~`、“,?,lr一,?,,,,,。‘。&#128544; 施耐德twdlmda20drt 用什么编程软件 如何利用TWIDOSOFT查看PLC中的程序 突然死机了,然后在开机就闪个不停,一直开不了,扔哪里一天多,开机出现team win recover project TWDLCAE40DRF用什么编程软件 捷安特xtc team的架子可不可以装dh速降的前叉? 求助,哪位高手用过施耐德PLC twido的,求教4~20MA的模拟量采集怎在TwidoSuite编程软件中怎么写 在安装完LR 后,打开创建脚本出现F:&#92;loadRunner&#92;LoadRunner&#92;LR&#92;bin&#92;vugen.exe文件出错(以及) 施耐德PLC编程软件twidosoft中如何给梯形图添加注释 怎么从施耐德Twido系列的 PLC中读取用户程序? 求高手解答,谢谢~ 小米8一直停留在LR.TERM页面怎么办? TWIDO TWDLCAA24DRF 电脑还需安装,编程软件TwidoSoft_V35(或更高版本),及驱动 施耐德TWIDO系列plc,使用twidosoft编程,结果组态软件IFIX采集不到PC中的变量数据。 基于UDP协议完成SR(SELICTIVE REPEAT)机制。 8台电脑需要多少M的光纤或者宽带 公司组网,电信的10M光钎,想问下公司有70多台电脑,不知道网速够不够,在路由上每台应该*多少? 公司或学校的网速大概是多少,每台电脑网速的分配又是怎么样的?望高手回答 贵州省医保如何办理流程 几台电脑都是十几k网速 hotmail是哪个公司的 梦见上河洗衣服走错路了 梦见走错路被别人拿蛇咬,但是好像蛇不咬我, PHP中双冒号和箭头操作符的区别 《美女军团的贴身保镖》中女主角有几个?(名字也拜托了) 美女军团的贴身保镖好看吗? 网络小说美女军团的贴身保镖所有的女主角都被推到了吗,不是一笔带过那种 美女军团的贴身保镖中主角是只暴戾还是~~ 召唤美女军团 中风雅的父亲,哥哥和女皇最后活了吗?还有他老婆有哪些啊 男主艳情类似于温床上的美女军团的小说 求助:怎么测试电脑游戏卡顿原因 cadisplaylink监控卡顿原理 电脑不正常卡顿应该怎么检查问题呢? 什么水果补水好