|
发表于 2022-8-6 07:37:00
|
显示全部楼层
iic程序:
#include "iic.h"
void iic_start(void)
{
IIC_SDA=1;//如果把该条语句放在SCL后面,第二次读写会出现问题
delay_10us(1);
IIC_SCL=1;
delay_10us(1);
IIC_SDA=0;
delay_10us(1);
IIC_SCL=0;//代表总线处于占用状态
delay_10us(1);
}
void iic_stop(void)//停止信号
{
IIC_SDA=0;//如果把该条语句放在SCL后面,第二次读写会出现问题
delay_10us(1);
IIC_SCL=1;
delay_10us(1);
IIC_SDA=1;
delay_10us(1);
}
void iic_ack(void)//应答信号
{
IIC_SCL=0;
IIC_SDA=0;
delay_10us(1);
IIC_SCL=1;
delay_10us(1);
IIC_SCL=0;
}
void iic_nack(void)//非应答信号
{
IIC_SCL=0;
IIC_SDA=1;
delay_10us(1);
IIC_SCL=1;
delay_10us(1);
IIC_SCL=0;
}
char iic_wait_ack(void)//等待应答,主机接收应答信号,返回值为应答值
{
char count=0;
IIC_SCL=1;
delay_10us(1);
while(IIC_SDA)
{
count++;
if(count>100)//SDA一直为高认为为非应答
{
iic_stop(); //给到停止信号
return 1;
}
}
IIC_SCL=0;
return 0;
}
void iic_write_byte(char dat)
{
char i=0;
IIC_SCL=0;//先允许数据变化
for(;i<8;i++)//开始写入
{
if((dat&0x80)>0)//循环8次将一个字节传出,先传高再传低位
IIC_SDA=1;
else
IIC_SDA=0;
dat<<=1;
delay_10us(1);
IIC_SCL=1;//数据保持稳定
delay_10us(1);
IIC_SCL=0;
delay_10us(1);
}
}
char iic_read_byte(char ack)//读取从机值返回,主机给到应答信号是否继续读取
{
char i=0,receive=0;//rec保存中间读取得到的值
for(i=0;i<8;i++)
{
IIC_SCL=0;
delay_10us(1);
IIC_SCL=1;//开始读取
receive<<=1;//保存得到的位值,如果rec不移位的后果?
if(IIC_SDA)
receive++;
delay_10us(1);
//IIC_SCL=0;不需要
//delay_10us(1);
}
if(ack==0)
iic_ack();
else if(ack==1)
iic_nack();
return receive;
} |
|