spi只能发送,但收不到数据,只能收到0
本帖最后由 liyiranlab 于 2019-4-11 09:32 编辑用的芯片STM32F103C8T6,3天了一直没读出正确的数据,终于发现是被延迟了一个发送周期;
/* 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;
器件支持的模式是符合的吗?时钟沿和极性 stm1024 发表于 2019-4-7 17:24
器件支持的模式是符合的吗?时钟沿和极性
设置是对的 stm1024 发表于 2019-4-7 17:24
器件支持的模式是符合的吗?时钟沿和极性
我第一次用arm,貌似 DR是个16位寄存器,要预读一下的感觉! 什么意思呢?
接收的数据,本来就要比发送的延迟一个字节。
比如第一次发送要读数据的地址,第二次接收的才是第一次地址对应的数据。 toofree 发表于 2019-4-8 11:42
什么意思呢?
接收的数据,本来就要比发送的延迟一个字节。
比如第一次发送要读数据的地址,第二次接收的才 ...
在我的想象中如果是8bit缓冲,发一次就会有回来8bit,如果是16bit缓冲的话,才需要发两次
页:
[1]