找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

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

[复制链接]
sky880429 发表于 2014-9-1 14:51:23 | 显示全部楼层 |阅读模式

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

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

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

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,求高手哪里出错了
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-12-23 15:43 , Processed in 0.053976 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表