关于I2C传输协议的一些问题
我在编程的时候这么写
void start() //开始信号
{
scl=1;
delay();
sda=1;
delay();
sda=0;
delay();
}
void stop() //结束信号
{
scl=1;
delay();
sda=0;
delay();
sda=1;
delay();
}
这么写不能实现功能。而改成下面这样就可以了:
void start() //开始信号
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop() //停止
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
感觉时序上是一样的啊,求助!
你的程序在SCL=1时,SDA又变0又变1,这就不行啦。而应该是SDA先稳定不变,再将SCL=1,然后把SDA变一次,完成一次操作。
看的是郭天祥的书本,可是对于起始和终止信号就是在SCL为高电平期间SDA发生跳变啊,书上这么介绍的:SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。我两个函数都是使SCL为高,改变SDA的状态。
,我之前说错了,没表达好,意思是,只能变一次。而你是变两次了。我修改 了之前错误的表达,你再看看。
我调了一下,出问题的是stop函数,两个start都可以使用,可能是start跟在void init(){
sda=1;
delay();
scl=1;
delay();
}
后面,时序上不会出现二次跳变。而stop是跟在
void respons() //应答
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))i++;
scl=0;
delay();
}
后面,是不是在执行完应答函数之后sda已经变成高电平了?只有这样才会像你说的在SCL高电平期间产生二次跳变。
我发现我好像似乎没有解决你的问题。你可能是纠结于P181那个图,话说,在一个SCL高电平期间SDA做两次变化,真没试过。(我猜要么在一个SCL高电平期间SDA做两次变化不行,要么你delay不够,你试试延长delay)。呵呵,我也是半桶水而已。
这个……看看再说吧,,,
是跟着那个图来的,我试着延长了delay,还是不行。我在stop前面的respons后面加了句if(sda==1) P1=0xfe;结果就是sda=1,这样就向前面你说的那样stop中sda会发生两次跳变。可能这样真的不行。我也是个菜鸟,大家一起学习。
我试了 一下,好像P181那样做,就是在SCL=1的期间SDA变几次是没问题的哦,我之前的说法有误,你继续试一下。你可以再找找原因,我迟点再回来一起研究。像我这种半桶水的来帮人,果然有点坑,搞得新手有错误的观念,惨了惨了,你要重新思考不要我的观点,我的观点有错!。再认真检查一下程序。
(低成本、高性能、稳定成熟)变频器全套生产研发技术转让
关键词:变频器,成本极低、稳定成熟、快速投产,源码,技术转让
产品特色:国内市场份额占行业前列,知名度高,故障率低,稳定可靠。
产品性能:
结构紧凑,体积小;
高性能的电流矢量控制;
同时驱动永磁同步电机与异步电机;
无码盘矢量控制可达0.5Hz,150%转矩;
带编码器控制0Hz可提供180%的零速转矩(有传感器矢量控制)
V/F控制可达0.5Hz,150%转矩;
支持多个电压等级220V、3相380V、3相480V、3相690V、1140V。
更多详细资料请索取。
转让优势:(源自艾默生)程序源码(带注释),硬件原理图及PCB(控制板,驱动板,键盘板),器件清单BOM,产品使用说明书电子版。
合作方式:技术转让,技术合作,合作开发,合作生产等,为想生产变频器的公司或者个人提供技术咨询,为您的顺利生产铺平道路。
秋秋:二五一二二六二四七一
所在地:深圳