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

使用HAL_SPI_TransmitReceive 问题:示波器看MISO有返回数据 但是..

[复制链接]
木子-387117 提问时间:2016-12-22 11:05 /
5ST金币
(1)void ReadBuffer( uint8_t addr, uint8_t buffer )
{   
//NSS = 0;
    HAL_GPIO_WritePin(NSS_IOPORT, NSS_PIN,GPIO_PIN_RESET );
    SpiInOut( addr & 0x7F );//给地址  
    buffer = SpiInOut(0);//给数据0 全双工拿寄存器数值
//NSS = 1;
    HAL_GPIO_WritePin(NSS_IOPORT, NSS_PIN,GPIO_PIN_SET );
}
(2)uint8_t SpiInOut( uint8_t outData )
{
uint8_t lmGET_data;
HAL_SPI_TransmitReceive(&hspi1, &outData, &lmGET_data, 1, 3);
return lmGET_data;
}

收藏 1 评论15 发布时间:2016-12-22 11:05

举报

15个回答
木子-387117 回答时间:2016-12-22 11:05:54
实际测试NSS拉低之后 输出MOSI的地址和数据都正确 CLK上升沿输出数据。。。然而在给数据的时候MISO返回了数据在clk下降沿采样,,,示波器观察正确  但是如上程序lmGET_data始终为0
小小超 回答时间:2016-12-22 14:57:01
SPI发送数据跟接收数据是同时的,并不是分开的。

评分

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

查看全部评分

斜阳 回答时间:2016-12-22 18:58:53
应该是SPI的模式设置错了;
通过 SPI_CR1 寄存器中的 CPOL 和 CPHA 位,可以用软件选择四种可能的时序关系。 CPOL(时钟极性)位控制不传任何数据时的时钟电平状态。此位对主器件和从 器件都有作 用。如果复位 CPOL,SCK 引脚在空闲状态处于低电平。如果将 CPOL 置 1,SCK 引脚在 空闲状态处于高电平。
如果将 CPHA(时钟相位)位置 1,则 SCK 引脚上的第二个边沿(如果复位 CPOL 位,则 为下降沿;如果将 CPOL 位置 1,则为上升沿)对 MSBit 采样。即,在第二个时钟边沿锁存 数据。如果复位 CPHA 位,则 SCK 引脚上的第一个边沿(如果将 CPOL 位置 1,则为下降 沿;如果复位 CPOL 位,则为上升沿)对 MSBit 采样。即,在第一个时钟边沿锁存数据。
CPOL(时钟极性)和 CPHA(时钟相位)位的组合用于选择数据捕获时钟边沿。

评分

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

查看全部评分

xhzheng 回答时间:2016-12-23 15:01:52

评分

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

查看全部评分

海迹天涯 回答时间:2016-12-30 08:41:50
根据你的描述可以确定调用SPI函数时至少发送是正确的,可以确定SPI基础配置正确。可以尝试如下方法:
1.查看器件的时序与SPI配置的时序是否一致,主要看CPHA和CPOL。(这2个没配置对也是无法通信的)
2.确认硬件是否已经损坏。
jtc_88 回答时间:2016-12-30 13:07:18
uint8_t read_opcode_addr = 0,j = 0;

read_opcode_addr = 0xff;
HAL_SPI_TransmitReceive(&hspi1, &read_opcode_addr, &j, 1,1000);

如果你读取的是8位数据,每个字节分开读取看看,我配置一个芯片时就是出现这样的 问题;

评分

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

查看全部评分

木子-387117 回答时间:2017-2-18 16:49:19
海迹天涯 发表于 2016-12-30 08:41
根据你的描述可以确定调用SPI函数时至少发送是正确的,可以确定SPI基础配置正确。可以尝试如下方法:
1.查 ...

时钟极性和相位配置是正确的 硬件应该不可能损坏啊  示波器观察数据是正确的  但是receive没有采集到
木子-387117 回答时间:2017-2-18 16:51:46
jtc_88 发表于 2016-12-30 13:07
uint8_t read_opcode_addr = 0,j = 0;

read_opcode_addr = 0xff;

分开读取指的是什么  没太明白 发送接收函数分开么  你也遇到过这样的问题么 求指教
jtc_88 回答时间:2017-2-20 09:20:21
木子-387117 发表于 2017-2-18 16:51
分开读取指的是什么  没太明白 发送接收函数分开么  你也遇到过这样的问题么 求指教 ...

分开读,意思是一个字节一个字节的读
木子-387117 回答时间:2017-2-21 10:35:18
本帖最后由 木子-387117 于 2017-2-21 10:39 编辑
jtc_88 发表于 2017-2-20 09:20
分开读,意思是一个字节一个字节的读

就是读的8位bit  一个字节啊  然后示波器有数据 看下一楼  但是STM32木有采集到   
HAL_GPIO_WritePin(NSS_IOPORT, NSS_PIN,GPIO_PIN_RESET );片选o
    SpiInOut( addr & 0x7F );//给地址  
    buffer = SpiInOut(0);//给数据0 全双工拿寄存器数值
    HAL_GPIO_WritePin(NSS_IOPORT, NSS_PIN,GPIO_PIN_SET );片选1
木子-387117 回答时间:2017-2-21 10:38:17
示波器测试数据

MOSI和MISO

MOSI和MISO

MOSI和SCK

MOSI和SCK

MISO和SCK

MISO和SCK
zbber 回答时间:2017-2-21 11:21:04
应该是SPI的模式设置错了;
木子-387117 回答时间:2017-2-21 13:06:55
本帖最后由 木子-387117 于 2017-2-21 13:22 编辑
zbber 发表于 2017-2-21 11:21
应该是SPI的模式设置错了;
这是模式设置  应该没有错的啊  求帮看看  全双工 主 8位数据 相位极性都为0 MSB first
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
hua518888 回答时间:2017-2-27 23:41:51
我也是这个情况,解决了没?谢谢。
12下一页

所属标签

相似问题

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