高分悬赏急求哪位单片机C语言编程高手帮我翻译这个程序,由于要提问到每句,请务必能帮我每句都解释哦!

//发送应答信号
void ack()
{
sda=0;
scl=1;
delay4us();
scl=0;
sda=1;
}
//发送非应答信号
void noack()
{
sda=1;
scl=1;
delay4us();
scl=0;
sda=0;
}
//向芯片读取1字节
uchar recbyte()
{
uchar i,rd;
rd=0x00;
sda=1;
for(i=0;i<8;i++)
{
scl=1;
rd<<=1;
rd|=sda;
delay4us();
scl=0;
delay4us();
}
scl=0;
delay4us();
return rd;
}
//向芯片发送1字节
uchar sendbyte(uchar wd)
{
uchar i;
bit ack0;
for(i=0;i<8;i++)
{
sda=(bit)(wd&0x80);
_nop_();
_nop_();
scl=1;
delay4us();
scl=0;
wd<<=1;
}
delay4us();
sda=1;
scl=1;
delay4us();
ack0=!sda;
scl=0;
delay4us();
return ack0;
}
//接收多字节数据函数
uchar Recstring(uchar slave,uchar subaddr,uchar *buffer,uchar n)
{
uchar i;
start();
if(!sendbyte(slave)) return 0;
if(!sendbyte(subaddr)) return 0;
start();
if(!sendbyte(slave+1)) return 0;
for(i=0;i<n-1;i++)
{
buffer[i]=recbyte();
ack();
}
buffer[n-1]=recbyte();
noack();
stop();
return 1;
}
//发送多字节数据函数
uchar Sendstring(uchar slave,uchar subaddr,uchar *buffer,uchar n)
{
uchar i;
start();
if(!sendbyte(slave)) return 0;
if(!sendbyte(subaddr)) return 0;
for(i=0;i<n;i++)
{
if(!sendbyte(buffer[i])) return 0;
}
stop();
return 1;
}

你这个也太长了, 是个gpio 模拟 i2c 总线的吧? 问题一个一个得问吧,不然怎么回答。追问

要不解释后面发送、接收多字节函数的两段程序吧,前面还看得懂

追答

就说 Recstring 这个函数吧。

1, 首先要发送一个start信号,也就是在 scl为高的时候把 sda 从高拉低。start();就是这个作用。
2,然后发送从器件地址。if(!sendbyte(slave)) return 0; 因为是写操作,所以要判断从器件是否反馈了ack,通过sendbyte的返回值可以判断。
3, 写 从器件 的从地址,这里的从地址是我自己起的名字,如果是eeprom,它代表eeprom的内存地址,如果是其他器件,这个是该器件的某寄存器的地址,也有的器件是不需要这个地址的。
4,发送玩器件地址及其从地址后,从器件开始控制sda总线, 这时候就可以读取数据了。 buffer[i]=recbyte(); ack(); 每接受到一个byte就要给器件发送一个ack,否则器件会认为总线异常,从而停止发送。

5,当你想停止读取时, 发送一个noack,这时 从芯片放开对 sda的控制, 你的主控芯片就可以产生stop信号来停止传输了。

6,还有啥子不太了解的,再跟我讨论讨论

温馨提示:答案为网友推荐,仅供参考
相似回答