专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
IIC通讯总在while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));里面
2019-07-14 13:37
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
14798
18
922
IIC通讯,总是是在 while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));里面,不知道为什么,感觉上是没等到响应,我想问一下,
STM32
用库函数写IIC
通信
,等待ACK,用写中断服务函数吗?
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
vyewrewr
1楼-- · 2019-07-16 03:05
可以先用IO模拟IIC试一下,确定一下硬件没有问题。
STM32下IO口模拟IIC通讯的代码:
#define SCL_PORT GPIOA
#define SCL_PIN GPIO_Pin_1
#define SCL_HIGH GPIOA->BSRR=(uint32_t)GPIO_Pin_1
#define SCL_LOW GPIOA->BRR=(uint32_t)GPIO_Pin_1
#define SDA_PORT GPIOA
#define SDA_PIN GPIO_Pin_2
#define SDA_HIGH GPIO_>BSRR=(uint32_t)GPIO_Pin_2
#define SDA_LOW GPIOA->BRR=(uint32_t)GPIO_Pin_2
#define SDA_READ (uint16_t)(GPIOA->ID&GPIO_Pin_2)
#define SDA_OUT GPIOA->MODER|=((uint32_t)GPIO_Mode_OUT)<<(2*2))
#define SDA_IN GPIOA->MODER&=(GPIO_MODER_MODERO)<<(2*2))
#define SCL_OUTH() SCL_HIGH
#define SCL_OUTL() SCL_LOW
#define SDA_OUTH() SDA_HIGH
#define SDA_OUTL() SDA_LOW
#define SDA_SETIN() SDA_IN
#define SDA_READ() SDA_READ
void I2C_Delay(void)
{
uint8_t i = 200;
while(i--);
}
void SDA_SETOUT(void)
{
SDA_IN;
SDA_OUT;
}
void I2C_Start(void)
{
SCL_OUTH();
SDA_OUTH();
I2C_Delay();
SDA_OUTL();
I2C_Delay();
SCL_OUTL();
I2C_Delay();
}
void I2C_Stop(void)
{
SCL_OUTL();
SDA_OUTL();
I2C_Delay();
SCL_OUTH();
I2C_Delay();
SDA_OUTH();
Delay(Delay5ms); //Delay() 为系统延时,用于确保数据传输正确
}
uint8_t I2C_WriteByte(uint8_t Data)
{
uint8_t i,bAck=0;
for(i=0;i<8;i++)
{
SCL_OUTL();
if(Data & 0x80)
SDA_OUTH();
else
SDA_OUTL();
I2C_Delay();
SCL_OUTH();
I2C_Delay();
Data <<=1;
}
SCL_OUTL();
I2C_Delay();
SCL_OUTH();
I2C_Delay();
SDA_SETIN();
if(SDA_READ())
bAck=1;
else
bAck=0;
SCL_OUTL();
SDA_SETOUT();
I2C_Delay();
return ((uint8_t)(!bAck));
}
uint8_t I2C_ReadByte(uint8_t bLSByte)
{
uint8_t i,Data=0;
SDA_SETIN();
for(i=8;i!=8;i--)
{
SCL_OUTL();
Data = Data<<1;
I2C_Delay();
SCL_OUTH();
I2C_Delay();
if(SDA_READ())
Data |=0x01;
else
Data &=0xFE;
}
SCL_OUTL();
SDA_SETOUT();
if(bLSByte)
SDA_OUTH();
else
SDA_OUTL();
I2C_Delay();
SCL_OUTH();
I2C_Delay();
SCL_OUTL();
I2C_Delay();
return(Data);
}
uint8_t DAC_Write_1byte(uint8_t Slave,uint8_t Regist_Addr,uint8_t Data)
{
uint8_t succ,time=0;
I2C_Start();
succ=I2C_ReadByte(Slave);
while((succ!=1)&&(time<3)) //从机没有响应,重试三次
{
I2C_Stop();
I2C_Start();
succ=I2C_WriteByte(Slave);
time++;
}
succ=I2C_WriteByte(Regist_Addr); //发送寄存器地址
succ=I2C_WriteByte(Data); //发送数据
I2C_Stop();
return succ;
}
uint8_t DAC_Read_1byte(uint8_t Slave,uint8_t,Regist_Addr)
{
uint8_t succ,time=0;
uint8_t dat;
I2C_Start();
succ=I2C_WriteByte(Slave+1) //加1表示读数据
while((succ!=1)&&(time<3))
{
I2C_Stop();
I2C_Start();
succ=I2C_WriteByte(Slave+1);
time++;
}
succ=I2C_WriteByte(Regist_Addr);
dat=I2C_ReadByte(0);
I2C_Stop();
return dat;
}
加载中...
xieweibin
2楼-- · 2019-07-16 09:14
精彩回答 2 元偷偷看……
加载中...
YY599566
3楼-- · 2019-07-14 16:09
好的,不好意思,我给选错了,谢谢您的提醒。
加载中...
60user135
4楼-- · 2019-07-14 18:05
如果没有开启中断 是不需要中断服务函数的 基本就是通过while 等待相应的事件发生 如果硬件 读写程序都没有问题的话 没有响应的话 可能就是你等待的事件不对
加载中...
TOPCB
5楼-- · 2019-07-14 20:05
精彩回答 2 元偷偷看……
加载中...
zhouxk
6楼-- · 2019-07-15 00:00
本帖最后由 toofree 于 2018-2-27 11:55 编辑
好好整理一下问题吧。
用的哪个型号的MCU,具体型号?用的哪个版本的库?要控制的IIC外设是什么?
我只能告诉你,我在第一次用I2C读写EEPROM AT24CXX的时候,也遇到过类似这样的死循环出不来的问题,是有办法解决的。
解决方法大致有三种:
1、IO模拟I2C
2、操作完后,不能马上去读标志位,得延时一小会儿
3、while()循环中,增加一个超时退出自加变量
加载中...
1
2
3
下一页
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
STM32开发板免费用活动
7 个回答
stm32 处理 DHT11占用太多时间,大家程序是怎么设计的
8 个回答
分享一个STM32单片机做的离线编程器代码
9 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
STM32下IO口模拟IIC通讯的代码:
#define SCL_PORT GPIOA
#define SCL_PIN GPIO_Pin_1
#define SCL_HIGH GPIOA->BSRR=(uint32_t)GPIO_Pin_1
#define SCL_LOW GPIOA->BRR=(uint32_t)GPIO_Pin_1
#define SDA_PORT GPIOA
#define SDA_PIN GPIO_Pin_2
#define SDA_HIGH GPIO_>BSRR=(uint32_t)GPIO_Pin_2
#define SDA_LOW GPIOA->BRR=(uint32_t)GPIO_Pin_2
#define SDA_READ (uint16_t)(GPIOA->ID&GPIO_Pin_2)
#define SDA_OUT GPIOA->MODER|=((uint32_t)GPIO_Mode_OUT)<<(2*2))
#define SDA_IN GPIOA->MODER&=(GPIO_MODER_MODERO)<<(2*2))
#define SCL_OUTH() SCL_HIGH
#define SCL_OUTL() SCL_LOW
#define SDA_OUTH() SDA_HIGH
#define SDA_OUTL() SDA_LOW
#define SDA_SETIN() SDA_IN
#define SDA_READ() SDA_READ
void I2C_Delay(void)
{
uint8_t i = 200;
while(i--);
}
void SDA_SETOUT(void)
{
SDA_IN;
SDA_OUT;
}
void I2C_Start(void)
{
SCL_OUTH();
SDA_OUTH();
I2C_Delay();
SDA_OUTL();
I2C_Delay();
SCL_OUTL();
I2C_Delay();
}
void I2C_Stop(void)
{
SCL_OUTL();
SDA_OUTL();
I2C_Delay();
SCL_OUTH();
I2C_Delay();
SDA_OUTH();
Delay(Delay5ms); //Delay() 为系统延时,用于确保数据传输正确
}
uint8_t I2C_WriteByte(uint8_t Data)
{
uint8_t i,bAck=0;
for(i=0;i<8;i++)
{
SCL_OUTL();
if(Data & 0x80)
SDA_OUTH();
else
SDA_OUTL();
I2C_Delay();
SCL_OUTH();
I2C_Delay();
Data <<=1;
}
SCL_OUTL();
I2C_Delay();
SCL_OUTH();
I2C_Delay();
SDA_SETIN();
if(SDA_READ())
bAck=1;
else
bAck=0;
SCL_OUTL();
SDA_SETOUT();
I2C_Delay();
return ((uint8_t)(!bAck));
}
uint8_t I2C_ReadByte(uint8_t bLSByte)
{
uint8_t i,Data=0;
SDA_SETIN();
for(i=8;i!=8;i--)
{
SCL_OUTL();
Data = Data<<1;
I2C_Delay();
SCL_OUTH();
I2C_Delay();
if(SDA_READ())
Data |=0x01;
else
Data &=0xFE;
}
SCL_OUTL();
SDA_SETOUT();
if(bLSByte)
SDA_OUTH();
else
SDA_OUTL();
I2C_Delay();
SCL_OUTH();
I2C_Delay();
SCL_OUTL();
I2C_Delay();
return(Data);
}
uint8_t DAC_Write_1byte(uint8_t Slave,uint8_t Regist_Addr,uint8_t Data)
{
uint8_t succ,time=0;
I2C_Start();
succ=I2C_ReadByte(Slave);
while((succ!=1)&&(time<3)) //从机没有响应,重试三次
{
I2C_Stop();
I2C_Start();
succ=I2C_WriteByte(Slave);
time++;
}
succ=I2C_WriteByte(Regist_Addr); //发送寄存器地址
succ=I2C_WriteByte(Data); //发送数据
I2C_Stop();
return succ;
}
uint8_t DAC_Read_1byte(uint8_t Slave,uint8_t,Regist_Addr)
{
uint8_t succ,time=0;
uint8_t dat;
I2C_Start();
succ=I2C_WriteByte(Slave+1) //加1表示读数据
while((succ!=1)&&(time<3))
{
I2C_Stop();
I2C_Start();
succ=I2C_WriteByte(Slave+1);
time++;
}
succ=I2C_WriteByte(Regist_Addr);
dat=I2C_ReadByte(0);
I2C_Stop();
return dat;
}
好好整理一下问题吧。
用的哪个型号的MCU,具体型号?用的哪个版本的库?要控制的IIC外设是什么?
我只能告诉你,我在第一次用I2C读写EEPROM AT24CXX的时候,也遇到过类似这样的死循环出不来的问题,是有办法解决的。
解决方法大致有三种:
1、IO模拟I2C
2、操作完后,不能马上去读标志位,得延时一小会儿
3、while()循环中,增加一个超时退出自加变量
一周热门 更多>