OpenEdv-开源电子网

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

stm32f103 SPI1和SPI2进行通讯故障

[复制链接]

4

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-7-7
在线时间
0 小时
发表于 2013-8-24 16:34:14 | 显示全部楼层 |阅读模式

我想用SPI1和SPI2直接进行单向通讯 
从机下 我是不是将SSM置位  然后清零SSI 从机就会一直有效了  大神们帮忙瞧瞧我下面俩个初始化 哪里有问题 求指点  我现在两个SPI都没有反应 查看寄存器 时钟和相应位 已经配置成功了  通讯一直没反应 


SPI1:从 只接收
SPI2:主 只发送

SPI2      SPI1    
CLK------->CLK
MOSI----->MOSI
 //master
 void SPI2_Init(void)
{ //SPI2  PB12cs   PB13SCK  PB14MISO  PB15MOSI
  //GPIOB时钟已开启
 GPIOB->CRH&=0x000fffff;
 GPIOB->CRH|=0xBBB00000;
 GPIOB->ODR|=0x7<<13;
 
 
 RCC->APB1ENR|=1<<14;  //开启SPI2时钟
 
 SPI2->CR1&=0;
 SPI2->CR1|=(1<<14|1<<9|1<<6|1<<2); // 只发 主机   开启SPI功能

 SPI2->DR=0X45;
}

//Slave
void SPI1_Init(void)
{ //SPI1  PA4cs   PA5SCK  PA6MISO  PA7MOSI
  //GPIOA时钟已开启
 GPIOA->CRL&=0x000fffff;
 GPIOA->CRL|=0xBBB00000;
 GPIOA->ODR|=0x7<<5;
 
 
 RCC->APB2ENR|=1<<12;  //开启SPI2时钟
 
 SPI1->CR1&=0;
 SPI1->CR1|=(1<<10|1<<9|1<<6); // 只接收 从机 使能SSM 使能本地从机  开启SPI功能

 SPI1->CR2&=0;
 SPI1->CR2|=1<<6;//使能接收中断
 MY_NVIC_Init(1,1,35,1);//开SPI1中断 向量号35  类别:抢占1 子2 组2
}

我主机是这样发数据的
main()
{
   while(1)
{
   SPI2->DR=0x45;//在这里我给DR赋值  在软件仿真下 DR的值是0 没被改成0x45  因此SPI1的接收中断 也没有进去
  delay_ms(20);


}
现在运行起来 两个寄存器是这样的


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

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2013-8-24 16:45:24 | 显示全部楼层
你的波特率设置不对。SPI1默认的是fpclk/2=72M/2=36M,但是SPI只能到18M.
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复 支持 反对

使用道具 举报

4

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-7-7
在线时间
0 小时
 楼主| 发表于 2013-8-24 16:50:57 | 显示全部楼层
回复【2楼】feilusia:
---------------------------------
恩恩 非常感谢  我改一下 不晓得 其他的地方 配置的对不对 我先改下
回复 支持 反对

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2013-8-24 16:52:25 | 显示全部楼层
回复【3楼】qingtian305:
---------------------------------
main()
{
   while(1)
{
   SPI2->DR=0x45;//在这里我给DR赋值  在软件仿真下 DR的值是0 没被改成0x45  因此SPI1的接收中断 也没有进去
  delay_ms(20);


}
你主机就这么写?配置呢?
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复 支持 反对

使用道具 举报

4

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-7-7
在线时间
0 小时
 楼主| 发表于 2013-8-24 16:58:15 | 显示全部楼层
回复【4楼】feilusia:
---------------------------------
 //master
 void SPI2_Init(void)
这里是主机的初始化
回复 支持 反对

使用道具 举报

4

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-7-7
在线时间
0 小时
 楼主| 发表于 2013-8-24 17:00:34 | 显示全部楼层
回复【2楼】feilusia:
---------------------------------
我现在 的系统时钟是用的内部的 然后倍频 现在是20M
回复 支持 反对

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2013-8-24 17:18:35 | 显示全部楼层
回复【6楼】qingtian305:
---------------------------------
你两个波特率不一样。SPI1是在APB2上(=系统时钟),SPI2是在APB1上(=1/2系统时钟)。然后SPI默认配置下都是2分频,这时候你的SPI1是10M,你的SPI2是5M。
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复 支持 反对

使用道具 举报

4

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-7-7
在线时间
0 小时
 楼主| 发表于 2013-8-24 17:24:09 | 显示全部楼层
回复【7楼】feilusia:
---------------------------------
我是这样的 想用SPI1来接收单片机外部的一个SPI信号 只做接收  那么 还要配置SPI从模式下的波特率吗  那个外部的SPI波特率是未知的 这个传输的速度 不是由主机直接控制的吗 只要主机发CLK从机 就能收到主机发出的数据
回复 支持 反对

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2013-8-24 17:42:15 | 显示全部楼层
回复【8楼】qingtian305:
---------------------------------
给你参考下我写的吧,主从公用一个函数,根据参数来决定是主还是从。下面这句放头文件里。
typedef enum {spi1_mode_slave = 0, spi1_mode_master = !spi1_mode_slave} SPI1Status;
/*******************************************************************************
* Function Name: SPI1_Configuration
* Description : SPI模块包括相关IO口的配置
* Input       : spi1_mode:spi1_mode_master(主机),spi1_mode_slave(从机)
* Output      : None
* Return      : None
*******************************************************************************/
void SPI1_Configuration( SPI1Status spi1_mode )
{
RCC->APB2ENR |= 1<<2  ;        //PORTA时钟使能   
RCC->APB2ENR |= 1<<12 ;        //SPI1时钟使能 
RCC->APB2ENR |= 1<<0 ;         //复用功能时钟使能 
GPIOA->CRL &= 0X000FFFFF ; 
GPIOA->CRL |= 0XBBB00000 ;     //一定要用推挽加上拉电阻,否则数据会有错!   
GPIOA->ODR |= 7<<5 ;           //PA567上拉

SPI1->CR1 = 0x0000 ;           //SPI1->CR1复位
SPI1->CR1 |= 1<<9  ;           //nss软件管理
SPI1->CR1 |= 0<<11 ;           //数据格式:8bit
SPI1->CR1 |= 1<<1  ;           //CPOL=1:空闲模式下SCK为高电平 
SPI1->CR1 |= 1<<0  ;           //CPHA=1:数据采样从第二个时钟沿开始  
SPI1->CR1 |= 2<<3  ;           //Fsck=Fcpu/8
SPI1->CR1 |= 0<<7  ;           //MSBfirst 
if(spi1_mode==spi1_mode_master) //若为主机模式
{
SPI1->CR1 |= 0<<10 ;          //RXONLY:全双工模式
SPI1->CR1 |= 0<<15 ;          //BIDIMODE:双线双向
SPI1->CR1 |= 1<<8  ; //nss高电平 
SPI1->CR1 |= 1<<2  ; //SPI主机
SPI1->CR2 |= 1<<1  ;        //发送缓冲区DMA使能
}
else if(spi1_mode==spi1_mode_slave) //从机模式
{
SPI1->CR1 |= 1<<10 ;          //RXONLY:只接收模式
SPI1->CR1 |= 0<<15 ;          //BIDIMODE:双线双向
SPI1->CR1 &= ~(1<<8)  ;      //nss低电平 
SPI1->CR1 &= ~(1<<2)  ;      //SPI从机
SPI1->CR2 |= 1<<0  ;       //接收缓冲区DMA使能
SPI1->CR2 |= 1<<6  ;          //SPI接收中断使能
}
SPI1->CR1 |= 1<<6  ;           //SPI设备使能  
}
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复 支持 反对

使用道具 举报

4

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-7-7
在线时间
0 小时
 楼主| 发表于 2013-8-24 17:52:50 | 显示全部楼层
回复【9楼】feilusia:
---------------------------------
恩恩  我现在 发现个问题  我就是写那个SPI为主的时候 那个MASTER位被写为1后 会立刻变成0  我硬件有点问题
回复 支持 反对

使用道具 举报

4

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-7-7
在线时间
0 小时
 楼主| 发表于 2013-8-24 18:58:44 | 显示全部楼层
回复【10楼】qingtian305:
---------------------------------
可以通讯了  原因出在 主机配置上 SSI没有置位  不过我发送0x45  中断里 接收到的是0x4d
回复 支持 反对

使用道具 举报

4

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-7-7
在线时间
0 小时
 楼主| 发表于 2013-8-24 23:27:46 | 显示全部楼层
终于搞定了  真是 时钟的事
回复 支持 反对

使用道具 举报

12

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-1-5
在线时间
22 小时
发表于 2015-12-20 20:30:15 | 显示全部楼层
mark一下,这种问题要引起重视了
天道酬勤
回复 支持 反对

使用道具 举报

13

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-8-10
在线时间
23 小时
发表于 2016-9-23 17:28:53 | 显示全部楼层
大家好 测试了下SPI的SCK时钟线,发现是这样的。下面蓝色的是SCK,感觉很奇怪。时钟之间多了一个脉冲,怎么回事,求解
IMG_20160902_145425.jpg
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 19:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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