
本帖最后由 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 |
要么用标准函数库,要么用HAL库,寄存器还是不要用了吧,给你一位一位的对,太麻烦了。
你可以在工程中Debug调试,对照看一下寄存器的位都对不对。
评分
查看全部评分
评分
查看全部评分
可以问一下这几位是什么意思,我可能这里没设置好,我除了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 模式下,这个位不可用。