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

SPI全双工模式 实际测试有数据但是采集不到

[复制链接]
木子-387117 提问时间:2017-2-21 10:52 /
悬赏5ST金币已解决
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4 ,GPIO_PIN_RESET );片选0

HAL_SPI_Transmit(&hspi1,&liming,sizeof(liming),1000);发送数据

HAL_SPI_Receive(&hspi1,lmGET_data,sizeof(lmGET_data),1000);接收数据

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4 ,GPIO_PIN_SET );片选1

MOSI MISO

MOSI MISO

MOSI SCK 0x06

MOSI SCK  0x06

MISO SCK 0X6C

MISO SCK  0X6C

最佳答案

查看完整内容

是这样的。我看你的SPI两个字节是连续发送。你是用这两个命令之后来实现可以从波形上明显看出中间有一段停顿。所以更好的方式使用HAL_SPI_TransmitReceive直接发送接受两个字节。你只需要第二个字节也无所谓。 另外检查SPI的CPAL和CPOL设置的是否正确。 如果从你的波形上来看。1黄色线应该是MOSI,2是MOSI。看波形似乎以上设置没有错误。 F0016TEK.JPG 来看你的第二个字节也返回了数据。那么你就需要检查一下你的数据结构设置 ...
收藏 1 评论33 发布时间:2017-2-21 10:52

举报

33个回答
watershade 回答时间:2017-2-21 10:52:14
是这样的。我看你的SPI两个字节是连续发送。你是用这两个命令之后来实现可以从波形上明显看出中间有一段停顿。所以更好的方式使用HAL_SPI_TransmitReceive直接发送接受两个字节。你只需要第二个字节也无所谓。

另外检查SPI的CPAL和CPOL设置的是否正确。

如果从你的波形上来看。1黄色线应该是MOSI,2是MOSI。看波形似乎以上设置没有错误。


F0016TEK.JPG 来看你的第二个字节也返回了数据。那么你就需要检查一下你的数据结构设置的是否正确。liming2是什么类型的数据,是不是这里提取的时候出现了错误?


评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

木子-387117 回答时间:2017-2-21 10:53:51
求助求助 不明白
jtc_88 回答时间:2017-2-21 11:05:02
单纯发送使用HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);数据读取使用此函数HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout),尽量一个字节一个字节的读取数据;
read_opcode_addr = 0xff;
HAL_SPI_TransmitReceive(&hspi1, &read_opcode_addr, &j, 1,1000);

点评

正解  发表于 2017-2-21 12:41

评分

参与人数 1ST金币 +3 收起 理由
MrJiu + 3 支持!!!!

查看全部评分

watershade 回答时间:2017-2-21 12:37:02
什么叫实际测试有数据但是采集不到?
你是说发送有数据,但是接受没有数据?
如果是这样HAL_SPI_TransmitReceive可以解决问题
木子-387117 回答时间:2017-2-21 12:53:24
watershade 发表于 2017-2-21 12:37
什么叫实际测试有数据但是采集不到?
你是说发送有数据,但是接受没有数据?
如果是这样HAL_SPI_TransmitRe ...

实际示波器测试MISO有返回数据 见图3   但是程序上没有采集到一直是0 用了transmitreceive了
木子-387117 回答时间:2017-2-21 13:03:24
jtc_88 发表于 2017-2-21 11:05
单纯发送使用HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeou ...

这个我试过   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4 ,GPIO_PIN_RESET );
                   HAL_SPI_Transmit(&hspi1,&liming,sizeof(liming),1000);
       HAL_SPI_TransmitReceive(&hspi1, &liming, &liming2, 1, 1000);
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4 ,GPIO_PIN_SET );
实际测试数据如下  大神帮我分析一下
木子-387117 回答时间:2017-2-21 13:05:11
jtc_88 发表于 2017-2-21 11:05
单纯发送使用HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeou ...

这个我试过   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4 ,GPIO_PIN_RESET );
                   HAL_SPI_Transmit(&hspi1,&liming,sizeof(liming),1000);
       HAL_SPI_TransmitReceive(&hspi1, &liming, &liming2, 1, 1000);
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4 ,GPIO_PIN_SET );
实际测试数据如下  大神帮我分析一下
木子-387117 回答时间:2017-2-21 13:08:47
本帖最后由 木子-387117 于 2017-2-21 13:32 编辑

这是实际HAL_SPI_Transmit(&hspi1,&liming,sizeof(liming),1000);
       HAL_SPI_TransmitReceive(&hspi1, &liming, &liming2, 1, 1000); 实际测试波形  结果liming2一直为0

这是MISO数据 也就是第二个transreceive函数时候的数据

这是MISO数据  也就是第二个transreceive函数时候的数据

这是MOSI数据 一次transmit发送0x06 第二次transmitreceive也是发送0x06

这是MOSI数据 一次transmit发送0x06 第二次transmitreceive也是发送0x06
木子-387117 回答时间:2017-2-21 13:19:42
本帖最后由 木子-387117 于 2017-2-21 13:20 编辑

SPI协议  先MOSI给地址再MOSI给数据的时候通过MISO返回数据  所以我 HAL_SPI_Transmit(&hspi1,&liming,sizeof(liming),1000);先给地址
             HAL_SPI_TransmitReceive(&hspi1, &liming, &liming2, 1, 1000);给数据并取数据

SPI协议 先MOSI给地址再MOSI给数据的时候通过MISO返回数据

SPI协议  先MOSI给地址再MOSI给数据的时候通过MISO返回数据
木子-387117 回答时间:2017-2-21 13:47:12
无力了 应该不是硬件问题啊  试了两个板子 都是一样的
jackten 回答时间:2017-2-21 14:23:48
我也来学习学习                    
木子-387117 回答时间:2017-2-21 14:26:54
jackten 发表于 2017-2-21 14:23
我也来学习学习

我已经分析不出了
xmshao 回答时间:2017-2-21 16:19:34
不知你用哪个芯片。
不过不管哪个芯片,STM32各系列库里都有SPI全双工的例程,先用例程跑下。
木子-387117 回答时间:2017-2-21 16:20:41
本帖最后由 木子-387117 于 2017-2-21 16:51 编辑
xmshao 发表于 2017-2-21 16:19
不知你用哪个芯片。
不过不管哪个芯片,STM32各系列库里都有SPI全双工的例程,先用例程跑下。 ...

STM32L031的  没找到例程
123下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版