用stm32cubemx 生成的STM32G030J6的spi通讯,用Pin 1 做spi 的cs,4pin 做clk,6 pin 做mosi,5pin 做miso,这些是stm32cubemx自己生成,1pin 做cs是手动配置,在生成的代码中spi通讯没有内容,且测量的波形是锯齿波,没有出现方波呢,做一个验证程序,1 pin就是设高,设低,这样出个方波也出不来,请问是什么原因呢 代码如下: //1 pin 配置为输出,默认低电平, void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; / GPIO Ports Clock Enable / HAL_RCC_GPIOC_CLK_ENABLE(); HAL_RCC_GPIOA_CLK_ENABLE(); /Configure GPIO pin Output Level / HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_RESET); /Configure GPIO pin : PC14 / GPIO_InitStruct.Pin = GPIO_PIN_14; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); } //gpio 配置高低电平的封装函数 void Hal_GPIO_SetHigh(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin) { /Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_SET); } void Hal_GPIO_SetLow(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin) { /Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_RESET); } //spi 的配置 / SPI1 init function / void MX_SPI1_Init(void) { / USER CODE BEGIN SPI1_Init 0 / / USER CODE END SPI1_Init 0 / / USER CODE BEGIN SPI1_Init 1 / / USER CODE END SPI1_Init 1 / hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_1LINE; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial = 7; hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; //HAL_SPI_Init(&hspi1); if (HAL_SPI_Init(&hspi1) != HAL_OK) { Error_Handler(); } / USER CODE BEGIN SPI1_Init 2 / / USER CODE END SPI1_Init 2 / } void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(spiHandle->Instance==SPI1) { / USER CODE BEGIN SPI1_MspInit 0 / / USER CODE END SPI1_MspInit 0 / / SPI1 clock enable / __HAL_RCC_SPI1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /*SPI1 GPIO Configuration PA1 ------> SPI1_SCK PA11 [PA9] ------> SPI1_MISO PA12 [PA10] ------> SPI1_MOSI / //GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_11|GPIO_PIN_12; GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_12; //abolish miso pin GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF0_SPI1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); / USER CODE BEGIN SPI1_MspInit 1 / / USER CODE END SPI1_MspInit 1 / } } void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle) { if(spiHandle->Instance==SPI1) { / USER CODE BEGIN SPI1_MspDeInit 0 / / USER CODE END SPI1_MspDeInit 0 / / Peripheral clock disable / __HAL_RCC_SPI1_CLK_DISABLE(); /*SPI1 GPIO Configuration PA1 ------> SPI1_SCK PA11 [PA9] ------> SPI1_MISO PA12 [PA10] ------> SPI1_MOSI / //HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1|GPIO_PIN_11|GPIO_PIN_12); HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1|GPIO_PIN_12); //abolish miso pin / USER CODE BEGIN SPI1_MspDeInit 1 / / USER CODE END SPI1_MspDeInit 1 / } } //spi 的读写函数 / read a byte data/ uint8_t HAL_SPI1_ReadByte(SPI_HandleTypeDef *hspi) { uint8_t byte = 0; Hal_GPIO_SetLow(GPIOC,GPIO_PIN_14); HAL_Delay(2); HAL_SPI_Receive(hspi,&byte,1,HAL_MAX_DELAY); HAL_Delay(2); Hal_GPIO_SetHigh(GPIOC,GPIO_PIN_14); return byte; } /write a byte data/ void HAL_SPI1_WriteByte(SPI_HandleTypeDef *hspi, uint8_t slave_addr,uint8_t reg, uint8_t byte) { uint8_t tx_buf[3]; tx_buf[0] = slave_addr; tx_buf[1] = reg; tx_buf[2] = byte; Hal_GPIO_SetLow(GPIOC,GPIO_PIN_14); HAL_Delay(2); HAL_SPI_Transmit(hspi,tx_buf,2,HAL_MAX_DELAY); HAL_Delay(2); Hal_GPIO_SetHigh(GPIOC,GPIO_PIN_14); } //主循环while 内的语句 uint8_t Tx1_Data = 0x02; uint8_t Tx2_Data = 0x01; //HAL_Delay(1000); HAL_SPI1_WriteByte(&hspi1,0x9e,0x06,Tx1_Data); //Hal_GPIO_SetHigh(GPIOC,GPIO_PIN_14); HAL_Delay(10000); //Hal_GPIO_SetLow(GPIOC,GPIO_PIN_14); HAL_SPI1_WriteByte(&hspi1,0x9e,0x06,Tx2_Data); HAL_Delay(10000); 测量的波形如图:1pin 没有出现拉高的状态,在spi的写函数内有置高的语句,但实际结果没有置高,4pin 是clk,这个管脚上确没有波形存在,拉宽后波形如第二幅图,为什么clk波形是这种尖的脉冲呢,不是方波呢,有哪位大侠可以指点,非常感谢
|
STM32G070 I2C HAL库函数疑问
stm32g431rbt怎么显示汉字
STM32G0B1CC单片机多个从板使用CAN链接,CAN接收帧和发送帧丢失的问题。
STM32G0B1CBT6 Flash 不能写擦除,更不要说写入?fal库示例代码哪里有,分享一下,谢谢
各位大佬,同样的C代码执行结果不同的问题?
请问STM32L4 支持动态链接库吗,需要什么平台生成DLL,如何调用?
STM32G474 mian()函数中变量被异常改写的问题
flash写入
stm32g030j6m6如何使用串口烧录程序?NRST引脚能否作为普通输入IO口用?
TouchGFX GUI开发实践里面的代码工程从哪里下载
不用着急,先把那个片选脚的拉高拉低实现,解决最基本的问题。
然后着手SPI的通信调试。
感觉你现在是做Master, 其实可以使用PA14做硬件片选脚NSS,不用软件处理了。即像下面配置
至于端口A,B,C,通过CUBEMX配置已经很直观了。
原来是用5 Pin 做的spi的cs 片选信号,示波器量也是没有波形出来,今天又把1pin 单独拉高和拉低,确认是否控制正确,1 pin 不能拉高和拉低,只有在初始化时 ,默认为高,就一直是高了,默认低就一直是低了
通过stm32cubemx定义SPIx,生成代码后查看GPIO定义就知道了,另外,不需要自己在做GPIO初始化。
你的程序里没有CS的操作,所以看不到CS——PIN1的输出。
这是你自己需要写的,除非你定义SPI的硬件NSS。