打印

SPI->DR寄存器读不到数据

[复制链接]
6123|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiang_5288|  楼主 | 2011-10-14 11:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
循环执行SPI_I2S_SendData(SPI2, 0x01);这条语句,用示波器可以看到SI引脚输出的数据是对的,为什么在Memory1中输入SPI->DR的地址看到的始终为0x00呢?
沙发
香水城| | 2011-10-14 11:31 | 只看该作者
读SPI->DR和写SPI->DR是不同操作,操作的物理寄存器也不一样。

使用特权

评论回复
板凳
airwill| | 2011-10-14 11:44 | 只看该作者
不要在 Memory 窗口观察. Memory 窗口处理外设有问题. 可以在 Peripherals 窗口里看.
最好做个程序, 在合适的时候,读出来,放在内存或变量里面再看.

使用特权

评论回复
地板
xiang_5288|  楼主 | 2011-10-14 12:22 | 只看该作者
2# 香水城
那memory中看到的SPI->DR寄存器是发的数据还是收的数据呢,还是说不一定?
如何去看发送的数据是否发送出去了呢?

使用特权

评论回复
5
xiang_5288|  楼主 | 2011-10-14 12:23 | 只看该作者
3# airwill
在 Peripherals 窗口里只能看到SPI1,是否可以设置看SPI2呢?

使用特权

评论回复
6
香水城| | 2011-10-14 13:09 | 只看该作者
2# 香水城
那memory中看到的SPI->DR寄存器是发的数据还是收的数据呢,还是说不一定?
如何去看发送的数据是否发送出去了呢?
xiang_5288 发表于 2011-10-14 12:22


只能在SPI->DR读到收的数据。

要看发送的数据是否发送出去了,需要用示波器看引脚,或通过状态位判断。

使用特权

评论回复
7
xiang_5288|  楼主 | 2011-10-14 15:04 | 只看该作者
6# 香水城

我用示波器看了我SI引脚了,数据发出去的是对的!

使用特权

评论回复
8
xiang_5288|  楼主 | 2011-10-14 15:17 | 只看该作者
6# 香水城
是否while((SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE))==RESET);
这条语句判断TXE为1,就说明数据已经发送出去了?但是从机的寄存器是否真的收到了呢,头疼!

使用特权

评论回复
9
xiang_5288|  楼主 | 2011-10-14 15:22 | 只看该作者
另外,用示波器看SI的数据出来了,是否就能说明SCK是正确的呢?我用示波器看SCK感觉时钟是有了,但是波形非常的不好,一会搞张图上来再请教!

使用特权

评论回复
10
xiang_5288|  楼主 | 2011-10-14 15:27 | 只看该作者
SPI程序初始化程序如下:
static void SPI_Configuration(void)

  SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
   
  /* Enable SPI2 and GPIOB clocks */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
  
  /* Configure SPI2 pins: SCK and MOSI */
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_13 | GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         //推挽复用输出
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  /* Configure SPI2 pins: MIS0 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
   GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* Configure PB12 as Output push-pull,  NSS,*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽复用输出
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  
  /*中断输入*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;        //通用输入
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* SPI1 configuration */
  SPI_Cmd(SPI2, DISABLE);
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;   //0x0000
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;  //0x0000
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI2, &SPI_InitStructure);         
  /* Enable SPI1  */
  SPI_Cmd(SPI2, ENABLE);  
  SPI_SSOutputCmd(SPI2,ENABLE);
}

使用特权

评论回复
11
xiang_5288|  楼主 | 2011-10-14 15:30 | 只看该作者
SPI2发送接收程序如下:
while(1)
{
MC33993_CS_0();   //选中从机
  delay_us(1);
  SPI_I2S_ClearFlag(SPI2,SPI_I2S_FLAG_RXNE); //清标志位
  SPI_I2S_ClearFlag(SPI2,SPI_I2S_FLAG_TXE);   //清标志位
  SPI_I2S_SendData(SPI2, 0x01);                       //发送数据
  while((SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE))==RESET); //等待发送完成
  while((SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE))!=RESET);//等待接收完成
  delay_us(1);
  SPI_I2S_ClearFlag(SPI2,SPI_I2S_FLAG_RXNE);
  SPI_I2S_ClearFlag(SPI2,SPI_I2S_FLAG_TXE);
  SPI_I2S_SendData(SPI2, 0x00);
  while((SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE))==RESET);
  while((SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE))!=RESET);
  delay_us(1);
  SPI_I2S_ClearFlag(SPI2,SPI_I2S_FLAG_RXNE);
  SPI_I2S_ClearFlag(SPI2,SPI_I2S_FLAG_TXE);       
  SPI_I2S_SendData(SPI2, 0xc0);
  while((SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE))==RESET);
  while((SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE))!=RESET);
  MC33993_CS_1();
  re_data3 = SPI_I2S_ReceiveData(SPI2);  //接收数据
}

使用特权

评论回复
12
930290725| | 2011-10-14 16:42 | 只看该作者
jcidshcubsjcnsjc

使用特权

评论回复
13
taitaijing| | 2011-11-23 21:22 | 只看该作者
操作的寄存器不一样啊。

使用特权

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

本版积分规则

23

主题

97

帖子

2

粉丝