打印

STM32的SPI传输DR寄存器不能赋值

[复制链接]
13317|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xuxianghua|  楼主 | 2010-1-18 11:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,我是刚开始接触STM32的开发板,主芯片是stm32f103zet6
在做spi通信的时候,用KEIL MDK来做单步调试,执行SPI_I2S_SendData(SPI2, 0x88); 函数后,SPIx->DR的值始终为0,不知道问题出在哪?
请哪位朋友帮忙出些点子?
谢谢啊!
沙发
香水城| | 2010-1-18 15:03 | 只看该作者
你怎么知道SPIx->DR的值始终为0?

使用特权

评论回复
板凳
edwinsong| | 2010-2-26 15:29 | 只看该作者
我也遇到了相同的问题,SCK输出时钟正确了,NSS输出片选也正确,可我无论向DR中写什么数据,MOSI脚时钟都是低电平,完全没有波形,
注:使用的是官方的Demo板

使用特权

评论回复
地板
edwinsong| | 2010-2-26 15:32 | 只看该作者
看DR也是可以看的,将 SPIx->DR = Data;下面再加一条语句,设一个断点,在watch中看SPIx->DR,无论Data给的是什么数, SPIx->DR = Data;之后,SPIx->DR都是0!!这是为什么呢??香楼主求救啊!!! 2# 香水城

使用特权

评论回复
5
香水城| | 2010-2-26 15:40 | 只看该作者
看DR也是可以看的,将 SPIx->DR = Data;下面再加一条语句,设一个断点,在watch中看SPIx->DR,无论Data给的是什么数, SPIx->DR = Data;之后,SPIx->DR都是0!!这是为什么呢??香楼主求救啊!!! 2# 香水城  ...
edwinsong 发表于 2010-2-26 15:32


写SPIx->DR 与 读SPIx->DR操作的是不同的物理寄存器。

使用特权

评论回复
6
edwinsong| | 2010-2-26 16:03 | 只看该作者
那该如何解释有SCK波形,有NSS波形,而调用SPI_I2S_SendData(),却没有波形的问题呢?而且,while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_BSY)==SET);这条语句在初始化SPI2之后就成了死循环!!! 5# 香水城

使用特权

评论回复
7
edwinsong| | 2010-2-26 16:29 | 只看该作者
请务必帮我解决这个问题啊!!!!1

使用特权

评论回复
8
香水城| | 2010-2-26 16:33 | 只看该作者
使用ST提供的例程时有这个问题吗?

使用特权

评论回复
9
edwinsong| | 2010-2-26 16:47 | 只看该作者
stm3210e-eval这个demo中,好像没有没有完整的SPI的程序,所以,也没有找到参考,谢谢~~ 8# 香水城

使用特权

评论回复
10
edwinsong| | 2010-2-26 16:54 | 只看该作者
主要的配置和程序如下:
/* Configure SPI2  (PB.15/13/12) as alternate function push-pull */
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_13|GPIO_Pin_12;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_Init(GPIOB, &GPIO_InitStructure);
   
        /* Configure SPI2 MISO (PB.14) as alternate function push-pull */
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
   GPIO_Init(GPIOB, &GPIO_InitStructure);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
     

/*--------------- Reset SPI init structure parameters values -----------------*/
  /* Initialize the SPI_Direction member */
  SPI_InitStruct->SPI_Direction = SPI_Direction_2Lines_FullDuplex;

  /* initialize the SPI_Mode member */
  SPI_InitStruct->SPI_Mode = SPI_Mode_Master;

  /* initialize the SPI_DataSize member */
  SPI_InitStruct->SPI_DataSize = SPI_DataSize_8b;

  /* Initialize the SPI_CPOL member */
  SPI_InitStruct->SPI_CPOL = SPI_CPOL_Low;

  /* Initialize the SPI_CPHA member */
  SPI_InitStruct->SPI_CPHA = SPI_CPHA_1Edge;

  /* Initialize the SPI_NSS member */
  SPI_InitStruct->SPI_NSS = SPI_NSS_Hard;

  /* Initialize the SPI_BaudRatePrescaler member */
  SPI_InitStruct->SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;

  /* Initialize the SPI_FirstBit member */
  SPI_InitStruct->SPI_FirstBit = SPI_FirstBit_MSB;

  /* Initialize the SPI_CRCPolynomial member */
  SPI_InitStruct->SPI_CRCPolynomial = 7;
SPI_Init(SPI2,SPI_InitStruct);
   
SPI_Cmd(SPI2,ENABLE);
SPI_SSOutputCmd(SPI2,ENABLE);
while(1)
{
SPI_I2S_SendData(SPI2,0x30);
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) != RESET); //等待发送完成
Decrement_TimingDelay();
}

使用特权

评论回复
11
edwinsong| | 2010-2-26 16:54 | 只看该作者
拜托了~~

使用特权

评论回复
12
香水城| | 2010-2-26 16:57 | 只看该作者
GPIOB和SPI2的时钟开了吗?

使用特权

评论回复
13
edwinsong| | 2010-2-26 17:01 | 只看该作者
都开了
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC
         | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG
         | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
而且,SCK和NSS脚的波形都正确了,就是MOSI脚上没输出波形

使用特权

评论回复
14
edwinsong| | 2010-2-26 17:01 | 只看该作者
谢谢

使用特权

评论回复
15
香水城| | 2010-2-26 17:03 | 只看该作者
你还是先试试ST固件库中提供的例程吧。

使用特权

评论回复
16
edwinsong| | 2010-2-26 21:00 | 只看该作者
我把完整的程序传上来,谁有兴趣的下载了试试看是什么原因[local]1[/local]

使用特权

评论回复
17
gxgclg| | 2010-2-26 21:23 | 只看该作者
怎么没看到例程,楼主也不要太着急,问题总是可以找出来的

使用特权

评论回复
18
hizog| | 2010-2-26 22:58 | 只看该作者
您调试时直接在WATCH窗口用你这个SPI2->DR的地址采用*(xxx)的方式查看下内容呢。再看看你MOSI引脚是否有虚焊,外部是否被地短路了呢。

使用特权

评论回复
19
edwinsong| | 2010-2-27 09:15 | 只看该作者
谢谢各位兄弟的照顾,小弟把问题找到了
是配置的时候有点问题,
    SPI_InitTypeDef  SPI_InitStructure;
      SPI_Init(SPI2, &SPI_InitStructure);

     SPI_InitTypeDef  *SPI_InitStructure;
      SPI_Init(SPI2, SPI_InitStructure);
两种方式的不同,大家有兴趣的可以试一下,其中一种方式是不行的(至少针对某些固态库是不行的)

使用特权

评论回复
20
hsbjb| | 2010-2-27 16:06 | 只看该作者
两种方式不同点在哪,楼主是如何把这种问题找出来的呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

1

粉丝