OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2265|回复: 7

STM32模拟I2C位操作的问题

[复制链接]

9

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
140
金钱
140
注册时间
2018-2-3
在线时间
17 小时
发表于 2018-4-17 22:27:50 | 显示全部楼层 |阅读模式
1金钱
我按低位先出的顺序发送数据,接受到的数据刚好是相反的,比如发送0x0f,接收0xf0.这没问题
for(i=0;i<8;i++)
{
        k = (0x01&(byte>>i));
         SDA = k;
        SCL = 1;
        Delayus(Thigh);                                                //SCL高电平>4us
        SCL = 0;
        Delayus(Thddat);                                         //等待从机反应应答作用
}

然而,我正常的程序应该是,高位先出,但是用逻辑分析仪出来的是0x00.用仿真的watch1放k,值一直是0x80
for(i=0;i<8;i++)
{
        k = (0x80&(byte<<i));
         SDA = k;
        SCL = 1;
        Delayus(Thigh);                                                //SCL高电平>4us
        SCL = 0;
        Delayus(Thddat);                                         //等待从机反应应答作用
}


求解,多谢大佬了

最佳答案

查看完整内容[请看2#楼]

高位先出的那段代码里,下面这2句: k = (0x80&(byte
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2018-4-4
在线时间
17 小时
发表于 2018-4-17 22:27:51 | 显示全部楼层
本帖最后由 queelys 于 2018-4-18 08:48 编辑

高位先出的那段代码里,下面这2句:
k = (0x80&(byte<<i));
SDA = k;
改成:
if  (0x80 & (byte << i))
{
    SDA = 1;
}
else
{
    SDA = 0;
}
想想这么改的原因吧
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-4-17 22:46:56 | 显示全部楼层
[mw_shl_code=cpp,true]
for(i = 7;i >= 0;i--)
{
        k = (0x01&(byte>>i));
         SDA = k;
        SCL = 1;
        Delayus(Thigh);                                                //SCL高电平>4us
        SCL = 0;
        Delayus(Thddat);                                         //等待从机反应应答作用
}[/mw_shl_code]
回复

使用道具 举报

9

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
140
金钱
140
注册时间
2018-2-3
在线时间
17 小时
 楼主| 发表于 2018-4-18 07:45:10 | 显示全部楼层
Acuity 发表于 2018-4-17 22:46
[mw_shl_code=cpp,true]
for(i = 7;i >= 0;i--)
{

谢谢大哥的回复,我想问的是,我要通过左移的方式吧数据送出去的代码看起来没问题但是就是输出不了.由移就没问题.所以我不知道为什么
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-4-18 08:50:02 | 显示全部楼层
赤诚 发表于 2018-4-18 07:45
谢谢大哥的回复,我想问的是,我要通过左移的方式吧数据送出去的代码看起来没问题但是就是输出不了.由移就 ...

[mw_shl_code=c,true]
for(i=0;i<8;i++)
{
         if(0x80&(byte<<i))
               k = 1;
         else
               k = 0;
         SDA = k;
         SCL = 1;
        Delayus(Thigh);                                                //SCL高电平>4us
        SCL = 0;
        Delayus(Thddat);                                         //等待从机反应应答作用
}
[/mw_shl_code]
回复

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2018-4-12
在线时间
5 小时
发表于 2018-4-18 10:08:22 | 显示全部楼层
STM32有好几个I2C外设, 即便是占用了这个,还可以映射到别的IO口上, 为什么要用GPIO模拟呀, 多麻烦!
回复

使用道具 举报

9

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
140
金钱
140
注册时间
2018-2-3
在线时间
17 小时
 楼主| 发表于 2018-4-20 00:58:49 | 显示全部楼层
queelys 发表于 2018-4-18 08:46
高位先出的那段代码里,下面这2句:
k = (0x80&(byte

多谢大哥,我找到原因了
回复

使用道具 举报

9

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
140
金钱
140
注册时间
2018-2-3
在线时间
17 小时
 楼主| 发表于 2018-4-20 01:02:40 | 显示全部楼层
因为我对端口的操作是位带操作,源代码是*(volatile unsigned int *)((ADDR & 0XF0000000)+0x02000000+((ADDR & 0X00ffffff)<<5)+(BIT_NO<<2))       
,所以只接受0和1的参数,并不是单独的判断是否为真,所以直接赋值左移产生的0x80与0x00是不准确的,所以就只有右移产生的0x01与0x00才是有效的,才出现了只能右移不能左移的假象.在这里多谢楼上的两位大佬.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 04:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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