(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; } |
评分
查看全部评分
通过 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(时钟相位)位的组合用于选择数据捕获时钟边沿。
评分
查看全部评分
https://www.stmcu.org.cn/module/forum/thread-608513-1-1.html
评分
查看全部评分
1.查看器件的时序与SPI配置的时序是否一致,主要看CPHA和CPOL。(这2个没配置对也是无法通信的)
2.确认硬件是否已经损坏。
read_opcode_addr = 0xff;
HAL_SPI_TransmitReceive(&hspi1, &read_opcode_addr, &j, 1,1000);
如果你读取的是8位数据,每个字节分开读取看看,我配置一个芯片时就是出现这样的 问题;
评分
查看全部评分
时钟极性和相位配置是正确的 硬件应该不可能损坏啊 示波器观察数据是正确的 但是receive没有采集到
分开读取指的是什么 没太明白 发送接收函数分开么 你也遇到过这样的问题么 求指教
分开读,意思是一个字节一个字节的读
就是读的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
MOSIåMISO
MOSIåSCK
MISOåSCK
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;