你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm3g030 spi 通讯以及如何管脚的定义,怎么知道是A口,还是B口,还是C口呢

[复制链接]
小捕快 提问时间:2024-7-31 21:53 / 未解决

用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波形是这种尖的脉冲呢,不是方波呢,有哪位大侠可以指点,非常感谢

image.png

image.png

image.png
image.png
收藏 评论4 发布时间:2024-7-31 21:53

举报

4个回答
xmshao 回答时间:2024-8-1 10:27:56

不用着急,先把那个片选脚的拉高拉低实现,解决最基本的问题。

image.png

然后着手SPI的通信调试。

感觉你现在是做Master, 其实可以使用PA14做硬件片选脚NSS,不用软件处理了。即像下面配置

image.png

至于端口A,B,C,通过CUBEMX配置已经很直观了。

小捕快 回答时间:2024-8-1 21:10:12

原来是用5 Pin 做的spi的cs 片选信号,示波器量也是没有波形出来,今天又把1pin 单独拉高和拉低,确认是否控制正确,1 pin 不能拉高和拉低,只有在初始化时 ,默认为高,就一直是高了,默认低就一直是低了

Glenxu 回答时间:2024-8-3 11:41:12

通过stm32cubemx定义SPIx,生成代码后查看GPIO定义就知道了,另外,不需要自己在做GPIO初始化。

Glenxu 回答时间:4 天前

你的程序里没有CS的操作,所以看不到CS——PIN1的输出。

这是你自己需要写的,除非你定义SPI的硬件NSS。

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版