OpenEdv-开源电子网

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

SPI初始化函数问题

[复制链接]

46

主题

177

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
381
金钱
381
注册时间
2012-5-2
在线时间
0 小时
发表于 2012-6-7 17:41:57 | 显示全部楼层 |阅读模式
SPI初始化函数如下
void SPIx_Init(void)
{  
RCC->APB2ENR|=1<<2;       //PORTA时钟使能  
RCC->APB2ENR|=1<<12;      //SPI1时钟使能 
GPIOA->CRL&=0X000FFFFF; 
GPIOA->CRL|=0XBBB00000;//PA5.6.7复用    
GPIOA->ODR|=0X7<<5;    //PA5.6.7上拉
SPI1->CR1|=0<<10;//全双工模式
SPI1->CR1|=1<<9; //软件nss管理
SPI1->CR1|=1<<8;  
SPI1->CR1|=1<<2; //SPI主机
SPI1->CR1|=0<<11;//8bit数据格式
SPI1->CR1|=1<<1; //空闲模式下SCK为1 CPOL=1
SPI1->CR1|=1<<0; //数据采样从第二个时间边沿开始,CPHA=1  
SPI1->CR1|=7<<3; //Fsck=Fcpu/256
SPI1->CR1|=0<<7; //MSBfirst   
SPI1->CR1|=1<<6; //SPI设备使能
SPIx_ReadWriteByte(0xff);//启动传输  
}   

             我觉得标注为红色的三条语句的赋值符号应该为:‘&=’而非‘|=’
             因为只有
SPI1->CR1 的第10位为0才可以实现全双工,若原来第10位为1,现在让它|=0<<10,结果不还是为1吗?这样不是禁止输出模式,而不是全双工模式了吗?
                             同理 第11位 第7位也应该为“&=
                             但是如果我都改成“&=” 就没法读出W25X16的ID (我现在还没做出读f自己定义的lash内容的程序),请问我的理解错在哪里?为什么是‘|=’









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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-6-7 18:25:12 | 显示全部楼层
回复【楼主位】stm32007:
---------------------------------
这是象征性的,让你明白是第几个位,设置为0.
实际可以用&=~()这样子来做.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

46

主题

177

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
381
金钱
381
注册时间
2012-5-2
在线时间
0 小时
 楼主| 发表于 2012-6-7 18:56:03 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子兄我就是这里的疑问!
SPI1->CR1|=0<<7; //MSBfirst  
按照寄存器定义:对CR1,若第七位为0,则先发MSB。
我们编程时打算先发MSB;
我觉得应写成SPI1->CR1 &= 0<<7;
         而不是SPI1->CR1 |= 0<<7;

因为假设原来CR1第7位为1;则SPI1->CR1 |= 0<<7;之后第7位仍然为1,仍先发送LSB位
                                         只有SPI1->CR1 &= 0<<7;才能确保第7位100%为0,为0才能先发送MSB位。
我这样哪里不对?

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-6-7 22:26:28 | 显示全部楼层
软件仿真下,就知道你哪里错了!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

46

主题

177

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
381
金钱
381
注册时间
2012-5-2
在线时间
0 小时
 楼主| 发表于 2012-6-8 09:24:15 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
谢谢  搞明白了
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2012-6-30
在线时间
0 小时
发表于 2012-6-30 16:24:38 | 显示全部楼层
回复【5楼】stm32007:
---------------------------------
刚接触spi,我也有这个疑问,能讲解一下吗?谢谢!
回复 支持 反对

使用道具 举报

56

主题

289

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2012-11-16
在线时间
65 小时
发表于 2013-3-23 15:33:19 | 显示全部楼层
原子老师 我还是没搞明白
回复 支持 反对

使用道具 举报

10

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2012-11-30
在线时间
0 小时
发表于 2013-3-26 15:16:17 | 显示全部楼层
回复【楼主位】stm32007:
---------------------------------
麻烦问一下,你这样初始化之后SCK脚上有时钟吗,用示波器看过没?
回复 支持 反对

使用道具 举报

1

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
456
金钱
456
注册时间
2017-9-4
在线时间
70 小时
发表于 2018-9-10 21:21:36 | 显示全部楼层
有大哥看明白了,能讲一下吗,谢谢
回复 支持 反对

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
发表于 2018-9-10 21:33:22 | 显示全部楼层
用软件仿真,看寄存器的值。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 21:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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