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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版