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

spi只能发送,但收不到数据,只能收到0

[复制链接]
liyiranlab 提问时间:2019-4-7 14:27 /
本帖最后由 liyiranlab 于 2019-4-11 09:32 编辑

无标题.png 用的芯片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;







收藏 评论5 发布时间:2019-4-7 14:27

举报

5个回答
STM1024 回答时间:2019-4-7 17:24:28
器件支持的模式是符合的吗?时钟沿和极性

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

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位寄存器,要预读一下的感觉!
七哥 回答时间:2019-4-8 11:42:22
什么意思呢?
接收的数据,本来就要比发送的延迟一个字节。
比如第一次发送要读数据的地址,第二次接收的才是第一次地址对应的数据。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

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

在我的想象中如果是8bit缓冲,发一次就会有回来8bit,如果是16bit缓冲的话,才需要发两次

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版