木子-387117 发表于 2016-12-22 11:05:18

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

(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;}

木子-387117 发表于 2016-12-22 11:05:54

实际测试NSS拉低之后 输出MOSI的地址和数据都正确 CLK上升沿输出数据。。。然而在给数据的时候MISO返回了数据在clk下降沿采样,,,示波器观察正确但是如上程序lmGET_data始终为0

小小超 发表于 2016-12-22 14:57:01

SPI发送数据跟接收数据是同时的,并不是分开的。

斜阳 发表于 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(时钟相位)位的组合用于选择数据捕获时钟边沿。

xhzheng 发表于 2016-12-23 15:01:52

我使用HAL读取DEVICE ID OK的;
https://www.stmcu.org.cn/module/forum/thread-608513-1-1.html

海迹天涯 发表于 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位数据,每个字节分开读取看看,我配置一个芯片时就是出现这样的 问题;

木子-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

示波器测试数据

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

我也是这个情况,解决了没?谢谢。
页: [1] 2
查看完整版本: 使用HAL_SPI_TransmitReceive 问题:示波器看MISO有返回数据 但是..