![shequ.stmicroelectronics.cn](./template/st_v1/static/img/logo2.png)
用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波形是这种尖的脉冲呢,不是方波呢,有哪位大侠可以指点,非常感谢
|
TouchGFX GUI开发实践里面的代码工程从哪里下载
STM32G030内置温度传感器的校准值TS_CAL2的地址是多少?
STM32G031 SMBUS从机模式的tLOW:SEXT超时无效
STM32是小端模式,但为什么Keil中memory窗口和反汇编窗口的32位指令不一致?
fatfs挂载
FATFS版本问题。
STM32g0x1 FDCAN外设寄存器描述文档是哪一份?RM0444里貌似没有FDCAN外设描述
在keil中使用Event Recorder调试,中间没有语句的情况下也有1.5us左右的时间,这是什么原因呢
STM32G0 FLASH快速写入发生HardFault
如何更换工程所选的芯片
不用着急,先把那个片选脚的拉高拉低实现,解决最基本的问题。
然后着手SPI的通信调试。
感觉你现在是做Master, 其实可以使用PA14做硬件片选脚NSS,不用软件处理了。即像下面配置
至于端口A,B,C,通过CUBEMX配置已经很直观了。
原来是用5 Pin 做的spi的cs 片选信号,示波器量也是没有波形出来,今天又把1pin 单独拉高和拉低,确认是否控制正确,1 pin 不能拉高和拉低,只有在初始化时 ,默认为高,就一直是高了,默认低就一直是低了
通过stm32cubemx定义SPIx,生成代码后查看GPIO定义就知道了,另外,不需要自己在做GPIO初始化。
你的程序里没有CS的操作,所以看不到CS——PIN1的输出。
这是你自己需要写的,除非你定义SPI的硬件NSS。