全新论坛MCU智学网上线,欢迎访问新论坛!稀缺资源、技术干货、参考设计、原厂资料尽在MCU智学网
更新自动建库工具PCB Footprint Expert 2023.13 Pro / Library Expert 破解版

iic连续读,求高手帮忙看看程序哪里出错了

[复制链接]
2133 0

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
延时函数和头文件都对的

sbit  SDA = P2^0;                  //iic数据线
sbit  SCL = P2^1;         //iic地址线

/******************* 函数申明 *******************/
void init_iic() ;
void start_iic();
void stop_iic();
void anwser_iic();
void noanwser_iic();
void write_iic(uchar i);
uchar read_iic();
void write_add_date(uchar add,uchar date);
uchar read_add_date(uchar add);
void write_add_date_count (uchar add,uchar b[],uchar count);
void read_add_date_count (uchar add,uchar *rd,uchar count);



/******************* iic总线初始化 *******************/
void init_iic()   
{
SDA = 1;
SCL = 1;
}

/******************* iic开始信号 *******************/
/******************* 在SCL为高电平时,SDA有一个下降沿触发开始信号 *******************/
void start_iic()
{
SDA = 1;
SCL = 1;
delay5us();
SDA = 0;
delay5us();
}

/******************* iic停止信号 *******************/
/******************* 在SCL为高电平时,SDA有一个上升沿触发开始信号 *******************/
void stop_iic()
{
SDA = 0;
SCL = 1;
delay5us();
SDA = 1;
delay5us();
}

/******************* iic应答 *******************/
/******************* 在SCL为高电平时,SDA是一个低电平 *******************/
void anwser_iic()
{
SCL = 0;
SDA = 1;         //主机释放SDA
delay5us();
SDA = 0;
delay5us();
SCL = 1;
delay5us();
SCL = 0;
}

/******************* iic不应答 *******************/
/******************* 在SCL为高电平时,SDA是一个高电平 *******************/
void noanwser_iic()
{
SCL = 0;
SDA = 1;         //主机释放SDA
delay5us();
SDA = 1;
delay5us();
SCL = 1;
delay5us();
SCL = 0;
}

/******************* iic写 *******************/
/******************* 在SCL为高电平时,SDA要保持数据稳定;在SCL为低电平时,SDA可以改变,传送时先高后低 *******************/
void write_iic(uchar i)
{
uchar count;
for(count=0;count<8;count++)
{
SCL = 0;
i = i<<1;
SDA = CY;
delay5us();
SCL = 1;
delay5us();
SCL = 0;
delay5us();
}
}

/******************* iic读 *******************/
/******************* 在SCL为高电平时,SDA要保持数据稳定;在SCL为低电平时,SDA可以改变,传送时先高后低 *******************/
uchar read_iic()
{
uchar i,j;
for(i=0;i<8;i++)
{
SDA = 1;         //主机释放数据线
SCL = 0;
delay5us();
SCL = 1;
j = (j<<1)|SDA;
delay5us();
SCL = 0;
delay5us();
}
return j;
}

/******************* iic在指定地址写一个字节 *******************/
/******************* 在SCL为高电平时,SDA要保持数据稳定;在SCL为低电平时,SDA可以改变,传送时先高后低 *******************/
void write_add_date(uchar add,uchar date)
{
start_iic();
write_iic(0xA0);          //1010 000 0         最后一位为0------写         器件地址
anwser_iic();
write_iic(add);         //内存地址
anwser_iic();
write_iic(date);         //写数据
anwser_iic();
stop_iic();
}

/******************* iic在指定地址读一个字节 *******************/
/******************* 在SCL为高电平时,SDA要保持数据稳定;在SCL为低电平时,SDA可以改变,传送时先高后低 *******************/
uchar read_add_date(uchar add)
{
uchar w;
start_iic();
write_iic(0xA0);          //1010 000 0         最后一位为0------写         器件地址
anwser_iic();
write_iic(add);         //内存地址
anwser_iic();
start_iic();
write_iic(0xa1);         //1010 000 1         最后一位为1------读         器件地址
anwser_iic();
w = read_iic();                    //读数据
//        noanwser_iic();
stop_iic();
return w;
}

/******************* iic在指定地址写连续字节 *******************/
/******************* 在SCL为高电平时,SDA要保持数据稳定;在SCL为低电平时,SDA可以改变,传送时先高后低 *******************/
void write_add_date_count (uchar add,uchar* buf,uchar count)
{

while(count--)
{
write_add_date(add++,*buf++) ;
}
//        uchar i;
//        start_iic();
//        write_iic(0xA0);          //1010 000 0         最后一位为0------写         器件地址
//        anwser_iic();
//        write_iic(add);
//        anwser_iic();
//        while(count--)
//        {
//         write_iic(b[i]);         //写数据
//         i++;
//         anwser_iic();
//        }
//        stop_iic();
}

/******************* iic在指定地址读一段字节 *******************/
/******************* 在SCL为高电平时,SDA要保持数据稳定;在SCL为低电平时,SDA可以改变,传送时先高后低 *******************/
void read_add_date_count (uchar add,uchar *rd,uchar count)
{
start_iic();
write_iic(0xA0);          //1010 000 0         最后一位为0------写         器件地址
anwser_iic();
write_iic(add);         //内存地址
anwser_iic();
start_iic();
write_iic(0xa1);         //1010 000 1         最后一位为1------读         器件地址
anwser_iic();
while(count--)
{
   *rd= read_iic();                    //读数据
rd++;
anwser_iic;
}
//        noanwser_iic();
stop_iic();
}

void main()
{
   uchar buff[3];
   uchar arr[]={0,0xaa,0xaa,0xaa,0xaa,5,6,7,8,9,10,11,12,13,14,15,16,17,18,9,20,21,22,23,24,25,26,27,28,29,30,31,32,33};
   
   hjc52_init();//HL-1/HJ-3G/HJ-C52主板初始化函数
   init_iic();        //iic初始化

    write_add_date_count (0,arr,sizeof(arr));
delay50ms();
read_add_date_count (2,buff,sizeof(buff));
P1=buff[1];

   while(1)  ;  
}
最后BUFF里面的值都是0xff,求高手哪里出错了

举报

回复
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

打开支付宝扫一扫,最高立得1212元红包
搜索

图文热点

更多

社区学堂

更多

客服中心

QQ:187196467 服务时间:周一至周日 8:30-20:30

关注我们

关于我们
关于我们
友情链接
联系我们
帮助中心
网友中心
购买须知
支付方式
服务支持
资源下载
售后服务
定制流程
关注我们
官方微博
官方空间
官方微信
快速回复 返回顶部 返回列表