OpenEdv-开源电子网

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

STM32F103RB的SPI2和MC14489通信,无法给SPI2_DR写数据

[复制链接]

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2013-5-8
在线时间
2 小时
发表于 2014-2-20 10:36:50 | 显示全部楼层 |阅读模式
硬件上STM32F103的MOSI和 14489的DATA IN连接,  时钟信号也连了,应该没问题。 设置成单线单向的方式,CPU是主机,只发送信息给从机。
时钟的上升沿发送数据。
 IO设置:
//********************** SPI2通信×××××××××××××××××××××××××××××××××××××××××××  
    GPIOB->CRH&=0X0F0FFFFF; 
GPIOB->CRH|=0XB0B00000;//PB13,15.复用      
GPIOB->ODR|=0X5<<13;   //PB13,15上拉

SPI初始化:
//SPI2初始化 , 主模式,只发送,PB15->SIMO, B13->CLK
void SPI2_Init(void)
{  
RCC->APB1ENR|=1<<14;      //SPI2时钟使能 

SPI2->CR1&=~(1<<0);          //数据采样从第二个时间边沿开始,CPHA=0
SPI2->CR1&=~(1<<1);          //空闲模式下SCK为0 CPOL=0
SPI2->CR1|=1<<2;          //配置为主设备
SPI2->CR1|=6<<3;          //波特率设置,Fsck=Fcpu/256   281K
SPI2->CR1&=~(1<<7);       //MSBfirst 

SPI2->CR1|=1<<9;          //软件nss管理
SPI2->CR1|=1<<8;  

SPI2->CR1&=~(1<<10);      //全双工模式 , 发送和接收
SPI2->CR1&=~(1<<11);      //8bit数据格式
    
SPI2->CR1&=~(1<<12);      //下个发送值来自发送缓冲
  
SPI2->CR1&=~(1<<15);     //单线双向
SPI2->CR1|=1<<14;     //只发模式
  
SPI2->CR1|=1<<6; //SPI设备使能
// SPIx_ReadWriteByte(0xff);//启动传输  
}   

但是运行的时候,SPI2的缓冲器时钟是0x00FF, 用中断看了,给SPI2_DR赋不了值。
下面是赋值后SPI2的状态:


各位兄弟帮忙看看什么问题,谢谢!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-2-20 12:42:10 | 显示全部楼层
回复【楼主位】junjunyu:
---------------------------------
你的这里
SPI2->CR1&=~(1<<0);          //数据采样从第二个时间边沿开始,CPHA=0
SPI2->CR1&=~(1<<1);          //空闲模式下SCK为0 CPOL=0
SPI2->CR1|=1<<2;          //配置为主设备
SPI2->CR1|=6<<3;          //波特率设置,Fsck=Fcpu/256   281K
SPI2->CR1&=~(1<<7);       //MSBfirst

改为下面这样看下

SPI2->CR1 = 0; //复位
SPI2->CR1 |= 0<<0; //CPHA=0,从第一个时钟沿开始采集数据
SPI2->CR1 |= 0<<1; //CPOL=0,SCK空闲时保持低电平
SPI2->CR1 |= 1<<2; //配置为主设备
SPI2->CR1 |= 7<<3; //波特率设置,Fsck=Fcpu/256???281K
SPI2->CR1 |= 0<<7; //MSBfirst
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2014-2-20
在线时间
1 小时
发表于 2014-2-20 13:56:24 | 显示全部楼层
回复【楼主位】junjunyu:
---------------------------------
如果我没有记错的话,SPI_DR寄存器只能看到接收的数值。是看不到写入的数值的。
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-2-20 14:43:03 | 显示全部楼层
回复【3楼】 leovo :
---------------------------------


还得认真看书,呵呵

现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2013-5-8
在线时间
2 小时
 楼主| 发表于 2014-2-20 17:36:01 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
位操作,SPI2->CR1 |= 0<<1; //CPOL=0,SCK空闲时保持低电平  能对第一位清零吗?
回复 支持 反对

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2013-5-8
在线时间
2 小时
 楼主| 发表于 2014-2-20 18:44:39 | 显示全部楼层
嗯,根据手册说明,重新设置了一下,时钟和MOSI口没有信号输出啊。
1、设置为主模式,一个时钟线和一个单向的数据线(输出,MOSI)。应该是BIDIMODE=0 ,RXONLY =0
 


2、按只发送数据的说明,在应用程序中写了测试代码

SPI 初始化程序如下:
//SPI2初始化 , 主模式,只发送,PB15->SIMO, PB13->CLK
void SPI2_Init(void)
{  
RCC->APB1ENR|=1<<14;      //SPI2时钟使能 
SPI2->CR1|=1<<0;          //数据采样从第二个时间边沿开始,CPHA=1
SPI2->CR1|=1<<1;          //空闲模式下SCK为高电平 CPOL=1
SPI2->CR1|=1<<2;          //配置为主设备
SPI2->CR1|=7<<3;          //波特率设置,Fsck=Fcpu/256 
SPI2->CR1&=~(1<<7);          //MSBfirst 

SPI2->CR1|=1<<9;    //软件nss管理
SPI2->CR1|=1<<8;

SPI2->CR1&=~(1<<11);      //8bit数据格式
    
SPI2->CR1&=~(1<<12);      //下个发送值来自发送缓冲
 
SPI2->CR1&=~(1<<15);   //双线单向
SPI2->CR1&=~(1<<10);       //全双工模式 , 发送和接收

SPI2->CR1|=1<<14;    //只发模式

SPI2->CR1|=1<<6; //SPI设备使能
// SPIx_ReadWriteByte(0xff);//启动传输  
}   

IO口设置如下
//********************** SPI2通信×××××××××××××××××××××××××××××××××××××××××××  
    GPIOB->CRH&=0X0F0FFFFF; 
  GPIOB->CRH|=0XB0B00000;//PB13,15.复用    
GPIOB->ODR|=0x5<<13;   //PB13,15上拉
另外: SPI的NSS 和 MISO 两个引脚都设置为GPIO 。

测试程序如下:
void SPIx_ReadWriteByte(void)                       //该函数每隔500us左右执行一次
{
static u8 step = 0 ;
switch(step)
{
 case 0 :                                            //TXE =1 ,写第一个数给发送缓冲
   if((SPI2->SR&1<<1)!=0)                     
{
  SPI2->DR = 0x55 ;                         
  step = 1;
}
 break ;
 case 1 :                                               //TXE =1 ,写第二个数给发送缓冲
         if((SPI2->SR&1<<1)!=0)
{
  SPI2->DR = 0x0A ;
  step = 2;
}
 break ;
   case 2:
   if((SPI2->SR&1<<1)!=0)                       //等TXE=1 , BSY=0 ,又发一遍上面两个数
{
  if ((SPI2->SR&1<<7)==0)
  step = 0;
}
 break ;
      }
   }

测试下来,MOSI口有脉冲,但是没测到 时钟信号。给SPI2_DR赋值后中断, SPI2寄存器:


问题出在哪儿呢,各位兄弟帮忙看看,谢谢!




回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-2-21 08:29:57 | 显示全部楼层
回复【5楼】junjunyu:
---------------------------------
可以
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2015-4-22
在线时间
0 小时
发表于 2015-4-24 13:35:07 | 显示全部楼层
我明明给SPIx->DR赋值了,SPIx->DR=Data,但是我通过Watch看到运行到这SPIx->DR为255,也就是0xff,为什么。。。
回复 支持 反对

使用道具 举报

12

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2015-8-13
在线时间
0 小时
发表于 2015-10-13 18:38:47 | 显示全部楼层
楼主:有没有解决啊??我也遇到同样的问题,求分享解决方法啊!!!
回复 支持 反对

使用道具 举报

7

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2016-6-27
在线时间
21 小时
发表于 2016-7-2 22:37:28 | 显示全部楼层
楼主求解决方案。。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 08:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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