求前辈看看这个I2C怎么行不通。帮我改改。。

[复制链接]
1424|13
手机看帖
扫描二维码
随时随地手机跟帖
落尘浅羽|  楼主 | 2014-10-25 21:00 | 显示全部楼层 |阅读模式
I2c, sd, AC, TE, ck
#include<reg52.h>
#include<intrins.h>
#define _nop()  _nop_()
#define uchar unsigned char

sbit sda=P2^2;
sbit scl=P2^3;

bit ack;

void delayus(uchar t);
void delayms(uchar t);

void delayus(uchar t)
{
while(--t);
}

void delayms(uchar t)
{
while(t--)
  {
  delayus(245);
  delayus(245);
  }
}

void start()
{
sda=1;
_nop();
scl=1;
_nop();
_nop();
_nop();
_nop();
_nop();
sda=0;
_nop();
_nop();
_nop();
_nop();
_nop();
scl=0;
_nop();
_nop();
}

void stop()
{
sda=0;
_nop();
_nop();
scl=1;
_nop();
_nop();
_nop();
_nop();
_nop();
sda=1;
_nop();
_nop();
_nop();
_nop();
_nop();
}

void ACK_T(void)
{
sda=0;
_nop();
_nop();
_nop();
scl=1;
_nop();
_nop();
_nop();
_nop();
_nop();
scl=0;
_nop();
_nop();
}

void NOACK(void)
{
sda=1;
_nop();
_nop();
_nop();
scl=1;
_nop();
_nop();
_nop();
_nop();
_nop();
scl=0;
_nop();
_nop();
}

void write(uchar c)
{
uchar i,temp;
temp=c;
scl=0;
for(i=0;i<8;i++)
{
  temp=temp<<1;
  sda=CY;
  _nop();
  scl=1;
  _nop();
  _nop();
  _nop();
  _nop();
  _nop();
  scl=0;
}
_nop();
_nop();
sda=1;
_nop();
_nop();
scl=1;
_nop();
_nop();
_nop();
if(sda==0)ack=0;
else ack=1;
scl=0;
_nop();
_nop();

}

unsigned char read()
{
unsigned char i;
uchar j;
uchar k;
scl=0;
for(i=0;i<8;i++)
{
j=sda;
k=(k<<1)|j;
scl=1;
_nop();
_nop();
_nop();
_nop();
_nop();
scl=0;
_nop();
_nop();
}
scl=0;
_nop();
_nop();
return (k);
}

bit write_string(uchar duxie,uchar dizhi,uchar *s,uchar geshu )
{
uchar b;
start();
write(duxie);
if(ack==0)return(0);
write(dizhi);
if(ack==0)return(0);
for(b=0;b<geshu;b++)
{
  write(*s);
  if(ack==0)return(0);
  s++;
}
stop();
return(1);
}

bit read_string(uchar duxie,uchar dizhi,uchar *s,uchar geshu )
{
uchar b;
start();
write(duxie);
if(ack==0)return(0);
write(dizhi);
if(ack==0)return(0);
for(b=0;b<geshu;b++)
  {
  *s=read();
  ACK_T();
  s++;
  }
  *s=read();
  NOACK();
  stop();
  return(1);
}

void main()
{
uchar a;
a=0xaa;

  write_string(0xae,80,&a,1);
  delayus(1000);
  read_string(0xaf,80,&a,1);
  while(1)
{
  P1=a;

}
}

相关帖子

落尘浅羽|  楼主 | 2014-10-25 21:26 | 显示全部楼层
点不亮LED

使用特权

评论回复
zhouyan3666| | 2014-10-25 21:47 | 显示全部楼层
P1上拉电阻加了吗?

使用特权

评论回复
落尘浅羽|  楼主 | 2014-10-25 21:48 | 显示全部楼层
用的是开发板,有上拉,LED低电平有效

使用特权

评论回复
zhouyan3666| | 2014-10-25 21:54 | 显示全部楼层
你是自发自收?

使用特权

评论回复
落尘浅羽|  楼主 | 2014-10-25 21:57 | 显示全部楼层
zhouyan3666 发表于 2014-10-25 21:54
你是自发自收?

嗯,自发,存入I2C,再读出来。试试程序

使用特权

评论回复
zhouyan3666| | 2014-10-25 22:01 | 显示全部楼层
这个我不懂了,我没看你的I2C是否正确,你好好看看下

使用特权

评论回复
ningling_21| | 2014-10-26 08:59 | 显示全部楼层
干脆去资料下载 的板块下载个好用的 程序,自己改一下端口就可以用了

使用特权

评论回复
zhangyongdzgcs| | 2014-10-26 15:47 | 显示全部楼层
你这个程序写的好吓人,个人建议,把程序优化下吧,弄那么多nop,你有一个函数封装起来就好,比如弄个us延时的单位。找不到原因,可以用逻辑分析仪看看iic的波形,start,stop和数据信号正常不。我这里有便宜的逻辑分析仪,买红外的遥控协议分析可以送红外分析仪的哦(自己弄得,量少成本高,不过是这里的小伙伴给我说说,我还是会降点价格哈)。店铺地址是http://tb413290484.taobao.com/?spm=0.0.0.0.ZroGD6  没事常来逛逛

使用特权

评论回复
icecut| | 2014-10-26 17:09 | 显示全部楼层
年年都有问iic的。你就不会网上搜个好用的代码?

使用特权

评论回复
qq65411253| | 2014-10-26 19:58 | 显示全部楼层
我今天心情好,送个库给你。没怎么优化但是还算简单好用,你改下接口就行了。
声明:本人不对这个库作任何保证,出什么问题自己负责。

SimIIC.rar

1.97 KB

使用特权

评论回复
受不了了| | 2014-10-26 20:24 | 显示全部楼层
icecut 发表于 2014-10-26 17:09
年年都有问iic的。你就不会网上搜个好用的代码?

每年都有新人参加工作嘛,二姨家几大月经贴,定时器精度,键盘扫描,24C02存储,串口通讯,以前还有汇编与C,建议专门整个精华贴把这些问题解决了,新人一进门就能看见;P

使用特权

评论回复
icecut| | 2014-10-26 21:13 | 显示全部楼层
本帖最后由 icecut 于 2014-10-26 21:15 编辑
受不了了 发表于 2014-10-26 20:24
每年都有新人参加工作嘛,二姨家几大月经贴,定时器精度,键盘扫描,24C02存储,串口通讯,以前还有汇编 ...

哈哈。可乐啊。。。
看看楼下我的flash教学动画。。。

使用特权

评论回复
icecut| | 2014-10-26 21:14 | 显示全部楼层
本帖最后由 icecut 于 2014-10-26 21:16 编辑



点击连接无法跳转可直接访问动画地址:http://antriver.com/images/iic.swf

使用特权

评论回复
评分
参与人数 2威望 +4 收起 理由
sunightms + 3 很给力!
mystery11 + 1 简直不能更赞
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

7

帖子

0

粉丝