liyiranlab 发表于 2019-4-7 14:27:55

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:28

器件支持的模式是符合的吗?时钟沿和极性

liyiranlab 发表于 2019-4-7 17:33:27

stm1024 发表于 2019-4-7 17:24
器件支持的模式是符合的吗?时钟沿和极性

设置是对的

liyiranlab 发表于 2019-4-7 17:35:41

stm1024 发表于 2019-4-7 17:24
器件支持的模式是符合的吗?时钟沿和极性

我第一次用arm,貌似 DR是个16位寄存器,要预读一下的感觉!

toofree 发表于 2019-4-8 11:42:22

什么意思呢?
接收的数据,本来就要比发送的延迟一个字节。
比如第一次发送要读数据的地址,第二次接收的才是第一次地址对应的数据。

liyiranlab 发表于 2019-4-8 14:04:31

toofree 发表于 2019-4-8 11:42
什么意思呢?
接收的数据,本来就要比发送的延迟一个字节。
比如第一次发送要读数据的地址,第二次接收的才 ...

在我的想象中如果是8bit缓冲,发一次就会有回来8bit,如果是16bit缓冲的话,才需要发两次
页: [1]
查看完整版本: spi只能发送,但收不到数据,只能收到0