OpenEdv-开源电子网

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

模拟SPI由51移植到stm32发现了不通用,应该是位运算的区别,求解答

[复制链接]

62

主题

275

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1155
金钱
1155
注册时间
2012-3-4
在线时间
80 小时
发表于 2015-3-30 18:54:22 | 显示全部楼层 |阅读模式
5金钱
代码如下:注释部分是51单片机上,使用正常,但是在stm32上不正常,一度让我不知道咋办。。。。
由此猜测应该是两者对位运算的解析的区别,不知道哪位能讲解一下关于两者对位运算的区别,或者还有其他方面的注意事项呢?

/********************************************************************/

void WriteByte(U8 temp)
{
 /* U8 i;

  for(i=0;i<8;i++)
  {
SCLK=0;//Delay_10us();
    delay_us(50);
    MOSI = temp & 0x80;
SCLK=1;//Delay_10us();
    delay_us(50);
temp <<=1;
  }
  SCLK=0;*/
  
  u8 i;
    for(i=8;i>0;i--)   
    {   
SCLK=0;
if(temp&0x80)
         MOSI=1;   
        else 
         MOSI=0;  
        
        temp<<=1; 
        SCLK=1;   
delay_us(50);   
    SCLK=0; 
   delay_us(50);  
    }  
 
  
}

U8 ReadByte(void)
{
 /* U8 i,dat1;

  SCLK=0;
  dat1=0;
  for(i=0;i<8;i++)
  {
SCLK=1;//Delay_10us();
    delay_us(50);
dat1 <<=1;
    dat1 |= MISO; 
    //delay_us(10);
SCLK=0; //Delay_10us();
    delay_us(50);
  }
  
  return dat1;*/
  
  u8 i;   
    u8 temp=0;   
    for(i=8;i>0;i--)   
    {
        SCLK=1;   
delay_us(50);   
        temp<<=1;   
        if(MISO)temp++;
SCLK=0;   
delay_us(50);  
    }   
    return temp;
  
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-30 19:09:26 | 显示全部楼层
回复

使用道具 举报

0

主题

133

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2014-12-21
在线时间
1 小时
发表于 2015-3-31 08:28:38 | 显示全部楼层
建议用逻辑分析仪看下波形。有时候可能会出现时钟未使能,端口配置错误导致引脚没有输出等低级错误。。。
流过汗水才能代表自己真的学会了如何不流汗。
回复

使用道具 举报

62

主题

275

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1155
金钱
1155
注册时间
2012-3-4
在线时间
80 小时
 楼主| 发表于 2015-3-31 08:43:55 | 显示全部楼层
回复【3楼】花戒:
---------------------------------
配置没有问题,只是上面的代码,注释部分不能正常用MOSI = temp & 0x80;,非注释部分可以用  if(temp&0x80)
         MOSI=1;   
        else 
         MOSI=0; ,唯一区别就是这句,不知道stm32是不是不认第一个? #define MOSI Aout(7)
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2015-3-21
在线时间
0 小时
发表于 2015-3-31 08:56:20 | 显示全部楼层
我也是接触STM32不久,与51不同的地方很多,这也是许多人感觉ARM难学的地方,得转过这个弯儿来,就像学了单片机去学FPGA思维方式一时难以适应一样,不过这个还是比FPGA好学多了。
给你贴一段例程,你参考一下。

在处理之前为方便理解可作以下定义
#define MOSI_SET (GPIOA->BSRR=1<<0) //位控制变成1
#define MOSI_CLR (GPIOA->BRR=1<<0)
#define CLK_SET (GPIOA->BSRR=1<<2) 
#define CLK_CLR (GPIOA->BRR=1<<2)
#define MISO (GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)) //读出的就是1或0
接下来就是MOSI的写入n
u8 i;
for(i=0;i<8;i++)
{
if(n&0x80) MOSI_SET;
else MOSI_CLR;
SCK_SET;
n=n<<1;
SCK_CLR;
}
这样写入就完成了,与51的最大不同是51可以直接PA^0=n&0x80,
但STM32书写不再方便这样书写了。
人永远别以为自己了不起,当你以为自己了不起的时候,你真的就没什么了不起了。
回复

使用道具 举报

0

主题

133

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2014-12-21
在线时间
1 小时
发表于 2015-3-31 09:48:00 | 显示全部楼层
http://bbs.21ic.com/icview-108339-1-1.html
流过汗水才能代表自己真的学会了如何不流汗。
回复

使用道具 举报

0

主题

133

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2014-12-21
在线时间
1 小时
发表于 2015-3-31 09:48:51 | 显示全部楼层
http://bbs.21ic.com/icview-108339-1-1.html
流过汗水才能代表自己真的学会了如何不流汗。
回复

使用道具 举报

0

主题

133

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2014-12-21
在线时间
1 小时
发表于 2015-3-31 11:46:02 | 显示全部楼层
http://bbs.21ic.com/icview-108339-1-1.html
流过汗水才能代表自己真的学会了如何不流汗。
回复

使用道具 举报

62

主题

275

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1155
金钱
1155
注册时间
2012-3-4
在线时间
80 小时
 楼主| 发表于 2015-3-31 16:24:52 | 显示全部楼层
回复【5楼】低级工程师:
---------------------------------
难到不是重点,就是一些写法变了,,,,,据说51是认高位,  MOSI=tem&0x80; stm32认低位? mosi=tem&0x01;
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 07:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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