本帖最后由 liyiranlab 于 2019-4-11 09:32 编辑 /* SPI1 configuration */ SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI1设置为两线全双工 SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI1为主模式 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //SPI 发送接收16 位帧结构 SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行时钟在不操作时,时钟为高电平 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //第二个时钟沿开始采样数据 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS 信号由软件(使用SSI 位)管理 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; // 定义波特率预分频的值:波特率预分频值为8 //注意 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从MSB 位开始 SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC 值计算的多项式 SPI_Init(SPI1, &SPI_InitStructure); /* Enable SPI1 */ SPI_Cmd(SPI1, ENABLE); //使能SPI1 外设 ///////////////////////////////////////////////////////////////////////////////////// 下面是上图的发送代码 GPIO_ResetBits(NCS_GPIO_PORT,NCS_PIN); //片选低 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI1,0x50);//写 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); t = SPI_I2S_ReceiveData(SPI1); cnt = 0x150;//37us while(cnt--); while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI1,0xff);//读 while ((SPI1->SR&SPI_I2S_FLAG_RXNE) == RESET); t = SPI_I2S_ReceiveData(SPI1); while ((SPI1->SR&SPI_I2S_FLAG_TXE) == RESET); SPI1->DR = t; while ((SPI1->SR&SPI_I2S_FLAG_RXNE) == RESET); t = SPI1->DR; while ((SPI1->SR&SPI_I2S_FLAG_TXE) == RESET); SPI1->DR = t; while ((SPI1->SR&SPI_I2S_FLAG_RXNE) == RESET); t = SPI1->DR; |
评分
查看全部评分
设置是对的
我第一次用arm,貌似 DR是个16位寄存器,要预读一下的感觉!
接收的数据,本来就要比发送的延迟一个字节。
比如第一次发送要读数据的地址,第二次接收的才是第一次地址对应的数据。
评分
查看全部评分
在我的想象中如果是8bit缓冲,发一次就会有回来8bit,如果是16bit缓冲的话,才需要发两次