本帖最后由 wanyisq 于 2016-5-25 09:20 编辑
我把以前的工程中的模拟SPI换成cubemx生成的硬件SPI代码,驱动OLED。但是一直没效果。之前没用过CUBEMX,不知道问题在哪。
å§ç»é
ç½®
SPIé
ç½®
管èé
ç½®
生成的SPI.c文件如下
- #include "spi.h"
- #include "gpio.h"
- /* USER CODE BEGIN 0 */
- /* USER CODE END 0 */
- SPI_HandleTypeDef hspi1;
- /* SPI1 init function */
- void MX_SPI1_Init(void)
- {
- 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_16;
- hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
- hspi1.Init.TIMode = SPI_TIMODE_DISABLED;
- hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
- hspi1.Init.CRCPolynomial = 10;
- HAL_SPI_Init(&hspi1);
- }
- void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- if(hspi->Instance==SPI1)
- {
- /* USER CODE BEGIN SPI1_MspInit 0 */
- /* USER CODE END SPI1_MspInit 0 */
- /* Peripheral clock enable */
- __SPI1_CLK_ENABLE();
-
- /**SPI1 GPIO Configuration
- PA5 ------> SPI1_SCK
- PA7 ------> SPI1_MOSI
- */
- GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- /* USER CODE BEGIN SPI1_MspInit 1 */
- /* USER CODE END SPI1_MspInit 1 */
- }
- }
- void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi)
- {
- if(hspi->Instance==SPI1)
- {
- /* USER CODE BEGIN SPI1_MspDeInit 0 */
- /* USER CODE END SPI1_MspDeInit 0 */
- /* Peripheral clock disable */
- __SPI1_CLK_DISABLE();
-
- /**SPI1 GPIO Configuration
- PA5 ------> SPI1_SCK
- PA7 ------> SPI1_MOSI
- */
- HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_7);
- }
- /* USER CODE BEGIN SPI1_MspDeInit 1 */
- /* USER CODE END SPI1_MspDeInit 1 */
- }
复制代码 mian.c中的初始化如下
- int main(void)
- {
- HAL_Init();
- SystemClock_Config();
- MX_GPIO_Init();
- MX_SPI1_Init();
- while (1)
- {
- }
复制代码
下面是SPI写函数。、
- void SPI_WriteCmd(uint8_t cmd)
- {
- DC_L;
- HAL_SPI_Transmit(&hspi1, (uint8_t *)cmd,1,100)
- while(HAL_SPI_GetState(&hspi1)==HAL_SPI_STATE_BUSY_TX);
- }
- void SPI_Write_Data(uint8_t data)
- {
- DC_H;
- HAL_SPI_Transmit(&hspi1, (uint8_t *)data,1,100)
- while(HAL_SPI_GetState(&hspi1)==HAL_SPI_STATE_BUSY_TX);
- }
复制代码 那位大神看得出问题在哪里吗
|
你用CubeMX配置的SPI,那几个参数你仔细琢磨下,多试试!
另外,你两个SPI函数纯是画蛇添足(?)无论你写命令也好,写数据也罢,直接用HAL_SPI_Transmit(,,,)不就得了?你把100改成1000试试。
其实是一个就行 配合OLED的数据/命令管脚DC,但我为了看明白问题在哪。
另外可以让我参考一下你的程序吗