打印
[STM32F1]

I2C的通信问题

[复制链接]
990|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gongche|  楼主 | 2021-10-10 11:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define slavewriteaddr 0x90  //定义从机写控制字节
#define slavereadaddr 0x91   //定义从机读控制字节
typedef unsigned char uint8
;uint8 date;
sbit SDA=P2^0;               //定义I2C通信的数据线
sbit SCL=P2^1;               //定义I2C通信的时钟线
sbit DS1302=P2^4;            //定义DS1302的复位引脚
void delay(uchar x)     //延时xms函数
{
uchar i,j;
for(i=x;i>0;i--)
   for(j=110;j>0;j--);
}
void init_ser()        //串口初始化,设置通信速率9600
{
TMOD=0x20;
SCON=0x50;
TH1=0xfd;
TL1=0xfd;
TR1=1;
ET1=0;
}
void I2C_start()       //I2C起始信号
{
SCL=1;
delay(1);
SDA=1;
delay(1);
SDA=0;
delay(1);
SCL=0;
}
void I2C_init()       //I2C初始化信号
{
SDA=1;
delay(1);
SCL=1;
delay(1);
}
void I2C_stop()       //I2C结束信号
{
SDA=0;
delay(1);
SCL=1;
delay(1);
SDA=1;
delay(1);
SCL=0;
delay(1);
}
uint8 I2C_writebyte(uint8 y)      //I2C写(发送)一个字节,y为待发送的字节数据
{
uchar i;
for(i=0;i<8;i++)
{
  SCL=0;
  delay(1);
  if(bit(y&0x80))
  SDA|=0x01;
  else
  SDA&=0xfe;
  delay(1);
  SCL=1;
  delay(1);
  y<<=1;
}
SDA=1;
delay(1);
SCL=1;
delay(1);
SDA=0;
delay(1);
SCL=0;
delay(1);

}
uchar I2C_readbyte()            //I2C读(接收)一个字节 ,y用于储存读到的字节数据
{
uchar i;
uint8 y;
for(i=0;i<8;i++)
{
  SDA=1;                            //释放数据总线
  SCL=0;
  y<<=1;
  if(SDA)
   y|=0x01;
  delay(1);
  SCL=1;
}
return y;
SCL=0;
delay(1);
SDA=1;
delay(1);
SCL=1;
delay(1);
SCL=0;
delay(1);

}
uchar readtype(uchar addr)          //I2C从PCF8591的某个通道读取数据
{
I2C_start();
I2C_writebyte(slavewriteaddr);
delay(1);
I2C_writebyte(addr);
delay(1);
I2C_start();
I2C_writebyte(slavereadaddr);
delay(1);
date=I2C_readbyte();
I2C_stop();
return date;
}
void UART_send(uint8 date)            //I2C从PCF8591读到的数据发送到串口缓存
{
SBUF=date;
while(!TI);
TI=0;
}
void main()                           //主函数
{
I2C_init();
init_ser();
DS1302=0;
while(1)
{
readtype(0x42);                       //从PCF8591通道2读取数据,并设置串口输出使能和单通道输入
UART_send(date);
delay(100);
}
}

各位大虾,现在求助啊
我做串口调试时,发现收到的总是ff,求各位大神帮忙解答下,万分感激

使用特权

评论回复
沙发
chuxh| | 2021-10-10 11:49 | 只看该作者
IIC?你用的STC的芯片吧,去他们官网,有例子。

使用特权

评论回复
板凳
stly| | 2021-10-10 11:51 | 只看该作者
仔细查看一下寄存器怎么变化的,看问题是什么

使用特权

评论回复
地板
xxrs| | 2021-10-10 11:53 | 只看该作者
串口收到的全是ff,芯片地址也是正确的

使用特权

评论回复
5
supernan| | 2021-10-10 11:55 | 只看该作者
参考一下51的IIC/I2C程序,应该都是模拟的

使用特权

评论回复
6
wyjie| | 2021-10-10 11:57 | 只看该作者
用逻辑分析仪或者示波器观察一下时序吧,光看代码没用的

使用特权

评论回复
7
dingy| | 2021-10-10 11:58 | 只看该作者
这个使用示波器测量一下

使用特权

评论回复
8
dengdc| | 2021-10-10 12:00 | 只看该作者
这个发送数据的时候有问题吗?

使用特权

评论回复
9
yinxiangh| | 2021-10-10 12:02 | 只看该作者
建议先测试一下IO的电压。

使用特权

评论回复
10
wyjie| | 2021-10-10 12:04 | 只看该作者
使用示波器测量单片机的IO信号变化。

使用特权

评论回复
11
chuxh| | 2021-10-10 12:06 | 只看该作者
iic通讯各种问题啊

使用特权

评论回复
12
supernan| | 2021-10-10 12:13 | 只看该作者
上拉下拉的电阻接了吗

使用特权

评论回复
13
wuhany| | 2021-10-10 12:17 | 只看该作者
需要用示波器看一下信号

使用特权

评论回复
14
songqian17| | 2021-10-10 12:19 | 只看该作者
估计还是时序哪里不对了

使用特权

评论回复
15
zhaoxqi| | 2021-10-10 12:21 | 只看该作者
用模拟的试试看

使用特权

评论回复
16
gongche|  楼主 | 2021-10-10 12:23 | 只看该作者

嗯,那我按大家的说法挨个排查一下,谢谢哈

使用特权

评论回复
17
labasi| | 2021-11-2 16:21 | 只看该作者
这个是模拟的iic啊

使用特权

评论回复
18
guanjiaer| | 2021-11-2 16:22 | 只看该作者
按理说应该问题比较好找

使用特权

评论回复
19
heimaojingzhang| | 2021-11-2 16:23 | 只看该作者
应该就是时序出问题了

使用特权

评论回复
20
keaibukelian| | 2021-11-2 16:26 | 只看该作者
返回代码是多少

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

768

主题

9410

帖子

2

粉丝