你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
p13692166934 提问时间:2018-11-1 15:33 /
本帖最后由 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[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


268272174448758263.jpg
收藏 1 评论3 发布时间:2018-11-1 15:33

举报

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

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

zjczm 回答时间:2018-11-2 10:28:36
用示波器检查接收的波形对不对。 以此排查,是发送不对,还是接收不对。先确定方向。

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

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 [1:0] : FIFO 发送存储水平
由硬件设置或清零
00: FIFO 空
01: 1/4 FIFO
10: 1/2 FIFO
11: FIFO 满(当 FIFO 门限大于 1/2 时认为是满)
注: 这些位在 I2S 模式下没有用

位 10:9 FRLVL [1:0] : 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 模式下,这个位不可用。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版