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

使用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 评论14 发布时间:2016-12-22 11:05

举报

14个回答
木子-387117 回答时间:2016-12-22 11:05:54
实际测试NSS拉低之后 输出MOSI的地址和数据都正确 CLK上升沿输出数据。。。然而在给数据的时候MISO返回了数据在clk下降沿采样,,,示波器观察正确  但是如上程序lmGET_data始终为0
ts2000 回答时间: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
分开读取指的是什么  没太明白 发送接收函数分开么  你也遇到过这样的问题么 求指教 ...

分开读,意思是一个字节一个字节的读
12下一页

所属标签

相似问题

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