OpenEdv-开源电子网

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

关于原子哥SPI驱动程序中的一个问题

[复制链接]

8

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2013-2-17
在线时间
0 小时
发表于 2013-3-6 09:58:55 | 显示全部楼层 |阅读模式
void SPIx_SetSpeed(u8 SpeedSet)这个函数中, 最后一句 

 SPI1->CR1|=1<<6; //SPI设备使能

在初始化函数中已经使能过了,这里不加上这句行吗?

还有,速度设置之前 需要把SPI禁止吗?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2013-2-17
在线时间
0 小时
 楼主| 发表于 2013-3-6 10:03:59 | 显示全部楼层
SPIx_ReadWriteByte(0xff);//启动传输

为什么这句是启动传输?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-6 10:29:12 | 显示全部楼层
回复【楼主位】Alex徐:
---------------------------------
设置之前要不要关闭,你试试就知道了。把我的关闭和开启SPI的操作屏蔽掉,你试试可以不。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-6 10:30:11 | 显示全部楼层
回复【2楼】Alex徐:
---------------------------------
让SPI发送一个数据,类似唱歌前,清清嗓子的作用,呵呵。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2013-3-26
在线时间
0 小时
发表于 2013-5-7 11:15:09 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
SPIx_ReadWriteByte(0xff);//
里面的0xff可以改为别的值吗?
有要求吗? 
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-7 12:03:34 | 显示全部楼层
最好别改。
回复 支持 反对

使用道具 举报

1

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2013-3-26
在线时间
0 小时
发表于 2013-5-7 12:38:25 | 显示全部楼层
回复【4楼】正点原子:
-----------------------------
也就是可以屏蔽掉,是吧!
回复 支持 反对

使用道具 举报

1

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2013-3-26
在线时间
0 小时
发表于 2013-5-7 12:53:34 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
void SPIx_SetSpeed(u8 SpeedSet)这个函数中
第一句SPI->CP1&=0XFFC7;中不是已经把SPI设备使能打开了吗?那么最后一句
SPI1->CR1|=1<<6; //SPI设备使能
就应该没有意义才对啊,
求解?
回复 支持 反对

使用道具 举报

1

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2013-3-26
在线时间
0 小时
发表于 2013-5-7 12:56:07 | 显示全部楼层
回复【楼主位】Alex徐:
---------------------------------
这个问题你都解决了吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-7 14:31:44 | 显示全部楼层
回复【8楼】电光火石:
---------------------------------
你如果觉得那句就开启了,那你把后面我的那句开启的语句屏蔽掉试试吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2013-3-26
在线时间
0 小时
发表于 2013-5-7 16:12:11 | 显示全部楼层
回复【10楼】正点原子:
---------------------------
我试过了,没什么变化,
改动部分
\\\\\\\\\\\\\\\\\\\
\\\\****先将初始化里的分频给消掉
void SPIx_Init(void)
{  
................  
//SPI1->CR1|=7<<3; //Fsck=Fcpu/256
SPI1->CR1|=0<<7; //MSBfirst   
SPI1->CR1|=1<<6; //SPI设备使能
SPIx_ReadWriteByte(0xff);//启动传输  
}   
\\\\\\\\\\\\\\\\\\\\
将最后一句spi设备使能消掉
void SPIx_SetSpeed(u8 SpeedSet)
{
SPI1->CR1&=0XFFC7;//Fsck=Fcpu/256
               .............................
                 .........................
//SPI1->CR1|=1<<6; //SPI设备使能   

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
在主函数中重新写入速度,
int main(void)
{
             .......
             SPI_Flash_Init();   //SPI FLASH 初始化  
SPIx_SetSpeed(2);
            .....................
}
实验现象却毫无变化
?????????????
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-7 17:43:33 | 显示全部楼层
回复【11楼】电光火石:
---------------------------------
那你就这样用吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-7 17:45:49 | 显示全部楼层
不过提醒你:
SPI->CP1&=0XFFC7;
这句是不带使能SPI时钟的,注意&=的用法。

能用是因为在SPIx_Init里面使能了时钟。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2013-3-26
在线时间
0 小时
发表于 2013-5-8 10:58:27 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
非常感谢原子的回答,但还有一个问题不懂
在写
  u8 SPIx_ReadWriteByte(u8 TxData)
{
u8 retry=0;  
while((SPI1->SR&1<<1)==0)//等待发送区空
{
retry++;
if(retry>200)return 0;
}   
SPI1->DR=TxData;     //发送一个byte 
retry=0;
while((SPI1->SR&1<<0)==0) //等待接收完一个byte  
{
retry++;
if(retry>200)return 0;
}        
return SPI1->DR;          //返回收到的数据     
}
不需要使能spi_cs=0吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-8 11:07:52 | 显示全部楼层
回复【14楼】电光火石:
---------------------------------
我在调用该函数之前,就使能了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2013-3-26
在线时间
0 小时
发表于 2013-5-8 12:52:28 | 显示全部楼层
void SPIx_Init(void)
{  
RCC->APB2ENR|=1<<2;       //PORTA时钟使能   
RCC->APB2ENR|=1<<12;      //SPI1时钟使能 
   
//这里只针对SPI口初始化
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);//启动传输  
}   
没有看到spi_cs=0啊(PA^3)
回复 支持 反对

使用道具 举报

1

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2013-3-26
在线时间
0 小时
发表于 2013-5-8 12:55:25 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
void SPIx_Init(void) 
{   
RCC->APB2ENR|=1<<2;       //PORTA时钟使能    
RCC->APB2ENR|=1<<12;      //SPI1时钟使能  
    
//这里只针对SPI口初始化 
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);//启动传输   
}    
函数SPIx_Init(void)是主函数里的第一个函数啊,
而在SPIx_Init(void)中没有看到spi_cs=0啊(PA^3),怎能
执行SPIx_ReadWriteByte(0xff);//启动传输   
求解?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-8 14:09:36 | 显示全部楼层
回复【16楼】电光火石:
---------------------------------
这是初始化,只是启动传输,输出SPI时钟,把DR里面的数据丢出去,不要求外部器件接收。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2013-3-26
在线时间
0 小时
发表于 2013-5-8 23:16:04 | 显示全部楼层
回复【18楼】正点原子:
---------------------------------
也就是说在执行SPIx_ReadWriteByte(0xff)时
返回的也是32内部spi相关寄存器的值,而不是外部flash返回的值是吧!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-9 00:40:37 | 显示全部楼层
回复【19楼】电光火石:
--------------------------------
纯粹就是产生SCK时钟,输出DR里面的值(该值可能不确定),不管别人收到没,也不需要别人应答.
你觉得实在不能理解,那就去掉这句吧,影响也不大.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
发表于 2013-11-30 03:34:57 | 显示全部楼层
回复【16楼】电光火石:
---------------------------------
SPI1->CR1|=1<<9; //软件nss管理
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-8 13:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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