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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版