STM32
直播中

向日葵的花季

9年用户 1336经验值
擅长:电源/新能源
私信 关注
[问答]

spi只能发送但收不到数据,只能收到0的原因?

我用示波器试过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[0]  =~(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


回帖(1)

郝埃连

2024-4-25 17:25:36
SPI只能发送但收不到数据,只能收到0的原因可能有以下几点:

1. SPI接收引脚(MISO)连接问题:请检查MISO引脚是否正确连接到SPI设备,以及是否有任何断线或短路。

2. SPI设备配置问题:确保SPI设备的配置正确,包括时钟速率、数据位宽度、CPOL和CPHA等参数。

3. SPI中断配置问题:如果使用中断方式进行SPI通信,请检查中断配置是否正确,包括优先级、中断使能等。

4. SPI接收缓冲区问题:请检查SPI接收缓冲区是否正确初始化,以及是否有溢出或未清空的情况。

5. SPI时钟问题:SPI通信依赖于时钟信号,如果时钟信号不稳定或不正确,可能导致接收数据错误。请检查时钟配置和时钟源。

6. 硬件故障:如果以上问题都排除了,可能是SPI设备的硬件故障,建议检查SPI设备或更换设备进行测试。

关于您提供的代码,我注意到您已经启用了SPI1的时钟,并配置了SCK和MOSI引脚。但是,您还需要配置MISO引脚以及SPI通信的相关参数。以下是一些建议:

1. 配置MISO引脚:将MISO引脚(例如PA6)配置为普通功能输入。

2. 配置SPI通信参数:设置SPI的数据位宽度、CPOL、CPHA等参数。

3. 初始化SPI:调用SPI_Init()函数进行SPI初始化。

4. 启用SPI:在完成配置后,使用SPI_Cmd(SPI1, ENABLE)启用SPI。

5. 如果使用中断方式,还需要配置和初始化SPI中断。

请检查您的代码,确保以上步骤都已正确执行。如果问题仍然存在,请尝试使用其他SPI设备进行测试,以排除硬件故障的可能性。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分