使用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;}实际测试NSS拉低之后 输出MOSI的地址和数据都正确 CLK上升沿输出数据。。。然而在给数据的时候MISO返回了数据在clk下降沿采样,,,示波器观察正确但是如上程序lmGET_data始终为0 SPI发送数据跟接收数据是同时的,并不是分开的。 应该是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(时钟相位)位的组合用于选择数据捕获时钟边沿。 我使用HAL读取DEVICE ID OK的;
https://www.stmcu.org.cn/module/forum/thread-608513-1-1.html
根据你的描述可以确定调用SPI函数时至少发送是正确的,可以确定SPI基础配置正确。可以尝试如下方法:
1.查看器件的时序与SPI配置的时序是否一致,主要看CPHA和CPOL。(这2个没配置对也是无法通信的)
2.确认硬件是否已经损坏。 uint8_t read_opcode_addr = 0,j = 0;
read_opcode_addr = 0xff;
HAL_SPI_TransmitReceive(&hspi1, &read_opcode_addr, &j, 1,1000);
如果你读取的是8位数据,每个字节分开读取看看,我配置一个芯片时就是出现这样的 问题; 海迹天涯 发表于 2016-12-30 08:41
根据你的描述可以确定调用SPI函数时至少发送是正确的,可以确定SPI基础配置正确。可以尝试如下方法:
1.查 ...
时钟极性和相位配置是正确的 硬件应该不可能损坏啊示波器观察数据是正确的但是receive没有采集到 jtc_88 发表于 2016-12-30 13:07
uint8_t read_opcode_addr = 0,j = 0;
read_opcode_addr = 0xff;
分开读取指的是什么没太明白 发送接收函数分开么你也遇到过这样的问题么 求指教 木子-387117 发表于 2017-2-18 16:51
分开读取指的是什么没太明白 发送接收函数分开么你也遇到过这样的问题么 求指教 ...
分开读,意思是一个字节一个字节的读
页:
[1]
2