p13692166934 发表于 2018-11-1 15:33:40

spi只能发送,但收不到数据,只能收到0会是什么原因导致

本帖最后由 p13692166934 于 2019-1-16 16:08 编辑

我用示波器试过MISO也有信号但是就是收不到,一直是0,发数据到是没问题,毕竟oled点亮了,但是flash却不能读,flash这一步的函数没问题,模拟试过可以读写,但是用控制器版本不知道是不是少调了什么,下面是代码

void SPI1_Init(void)
{

      
                //SPI1时钟使能
      RCC->APB2ENR |=0X01<<12;
      //SCK(PA5) MOSI(PA7)配置为普通功能推挽输出
      //端口模式设置
      //模式----通用输出模式(01)
      GPIOA->MODER &=~(0x03<<10 |0x03<<14);
      GPIOA->MODER |=0X02<<14 | 0X02<<10;
      //输出类型----推挽
      GPIOA->OTYPER &= ~(0X01<<7 | 0X01<<5);      
      //输出速度----100M
      GPIOA->OSPEEDR &=~(0x03<<14 |0x03<<10);
      //上下拉-----无上拉或下拉
      GPIOA->PUPDR &=~(0x03<<10);
      

      //MISO(pA6) 配置为浮空输入
      GPIOA->MODER &=~(0X03<<12);//pA6为输入模式
      GPIOA->MODER |=0X02<<12;
      
      
      GPIOA->AFR &=~(0x0fff<<20);//复用映射
      

      SPI1->CR1 &=~(0X01<<15);
      SPI1->CR1 &=~(0X01<<10);   //全双工模式
      
      SPI1->CR1 &=~(0X01<<11); //8位数据模式
      
      
      SPI1->CR1 |=0X03<<8;   //软件管理NSS,主模式

      
      
      SPI1->CR1 &=~(0X01<<7); //高位在前
      
      //波特率
      SPI1->CR1 &=~(0X07<<3);///2
      
      
      SPI1->CR1 |=0X01<<2;   //主模式
      SPI1->CR1 &=~(0X03<<0); //mode 0
      
      SPI1->CR2 &=~(0X01<<4); //摩托罗拉格式
      
      SPI1->CR2 &=~(0x07<<8);      
      SPI1->CR2 |=0x07<<8;//8位数据位宽
      
      SPI1->CR2 &=~(0x01<<12);      
      SPI1->CR2 |=0x01<<12;//FRXTH
      
      SPI1->CR2 &=~(0x01<<2);      
      SPI1->CR2 |=0x01<<2;//SSOE=1
      
      SPI1->CR1 |=0X01<<6;    //开SPI控制器
}
//spi读写函数--模式0
//_data:待发送的数据,如果是接收模式,发送的数据则应该是0xff
//返回值:接收到的数据。如果是发送模式,返回值可以丢弃

u8 SPI1_ReadWriteByte(u8 _data)
{
      while(!(SPI1->SR &(0X01<<1)));
      SPI1->DR=_data;
      while(!(SPI1->SR &(0X01<<0)));
      _data=SPI1->DR;
      return _data;      
}

uint16_t SPI_Flash_ReadID(void)
{
      uint32_t Temp = 0;         
      uint32_t i=0;

      Open_SPI_Flash();      
      SPI1_ReadWriteByte(W25X_ManufactDeviceID);//发送读取ID命令         
      SPI1_ReadWriteByte(0x00;         
      SPI1_ReadWriteByte(0x00);         
      SPI1_ReadWriteByte(0x00);      
      
      
      Temp|=SPI1_ReadWriteByte(0xFF)<<8;
      Temp|=SPI1_ReadWriteByte(0xFF);
      

      Close_SPI_Flash();                                    
      return Temp;
}                     


读出来的一直是0,各位大佬帮我看一下是出了什么问题这里有示波器彻底读写ID的波形,包括读地址和发0


toofree 发表于 2018-11-1 23:56:24

既然你说是发送没问题的话,那么接收就看MISO对应GPIO管脚的设置是怎么回事,其它的没问题。
要么用标准函数库,要么用HAL库,寄存器还是不要用了吧,给你一位一位的对,太麻烦了。
你可以在工程中Debug调试,对照看一下寄存器的位都对不对。

zjczm 发表于 2018-11-2 10:28:36

用示波器检查接收的波形对不对。 以此排查,是发送不对,还是接收不对。先确定方向。

p13692166934 发表于 2018-11-2 10:39:18

toofree 发表于 2018-11-1 23:56
既然你说是发送没问题的话,那么接收就看MISO对应GPIO管脚的设置是怎么回事,其它的没问题。
要么用标准函 ...

可以问一下这几位是什么意思,我可能这里没设置好,我除了FRXTH设置了,其他都没设置,这些需不需要设置
位 12 FRXTH : FIFO 接收门限
此位用来设置触发 RXNE 事件时的 RXFIFO 的阈值。
0:如果 FIFO 的存储水平大于或等于 1/2 ( 16 位),产生 RXNE 事件。
1:如果 FIFO 的存储水平大于或等于 1/4 ( 8 位),产生 RXNE 事件。
注: 该位在 I2S 模式下没有用

位 12:11 FTLVL : FIFO 发送存储水平
由硬件设置或清零
00: FIFO 空
01: 1/4 FIFO
10: 1/2 FIFO
11: FIFO 满(当 FIFO 门限大于 1/2 时认为是满)
注: 这些位在 I2S 模式下没有用

位 10:9 FRLVL : FIFO 接收存储水平
由硬件设置或清零
00: FIFO 空
01: 1/4 FIFO
10: 1/2 FIFO
11: FIFO 满
注:这些位在 I2S 模式和打开了 CRC 计算功能时的 SPI 单接受模式下,不使用。

位 2 SSOE : SS 输出使能
0:在主模式下 SS 输出被禁用, SPI 接口可以工作在多主机的配置下。
1: SPI 接口启用的同时在主模式下启用 SS 输出。 SPI 接口不能在多主环境下工作。
注: 在 I2S 模式和 SPI TI 模式下,这个位不可用。
页: [1]
查看完整版本: spi只能发送,但收不到数据,只能收到0会是什么原因导致