- 上一篇的SPI软硬件驱动OLED的测评篇硬件SPI的解决办法
- 上一篇说到硬件SPI无法驱动OLED显示的现象,而且SPI似乎比较慢,经过几天的研究终于解决的了问题,先说结论,代码没问题,解决办法是在SPI的CS SCK MOIS(或者叫SDIN)这三根线上串一个100R电阻,用来维持SPI的波形(原来有可能是因为SPI速度太快导致信号串扰),而在开发板上工程师也已经把100R给串好了(因为一开始懒得找这个口,丝印不好找
- 上一篇说到硬件SPI无法驱动OLED显示的现象,而且SPI似乎比较慢,经过几天的研究终于解决的了问题,先说结论,代码没问题,解决办法是在SPI的CS SCK MOIS(或者叫SDIN)这三根线上串一个100R电阻,用来维持SPI的波形(原来有可能是因为SPI速度太快导致信号串扰),而在开发板上工程师也已经把100R给串好了(因为一开始懒得找这个口,丝印不好找
- 关于SPI的另外一些补充:如果按上一篇的SPI的配置方法配置SPI,WireMode必须是4线制,SpiMode不能是MD_1,如果要用MD_1就要更改其他配置了,此外MD_2,MD_3都可以直接用。
-
stc_gpio_init_t stcGpioInit; stc_spi_init_t stcspiinit; /* Configuration SPI */ (void)GPIO_StructInit(&stcGpioInit); stcGpioInit.u16PinDrv = PIN_HIGH_DRV; stcGpioInit.u16PinInputType = PIN_IN_TYPE_CMOS; (void)GPIO_Init(CS2_PORT , CS2_PIN, &stcGpioInit); (void)GPIO_Init(MISO_PORT,MISO_PIN, &stcGpioInit); (void)GPIO_Init(SCK2_PORT, SCK2_PIN, &stcGpioInit); (void)GPIO_Init(SDIN_PORT , SDIN_PIN, &stcGpioInit); /* Configure Port */ GPIO_SetFunc(CS2_PORT, CS2_PIN, CS_FUNC); GPIO_SetFunc(SCK2_PORT, SCK2_PIN, SCK_FUNC); GPIO_SetFunc(SDIN_PORT, SDIN_PIN, MOSI_FUNC); GPIO_SetFunc(MISO_PORT, MISO_PIN, MISO_FUNC); /* Peripheral clock enable */ FCG_Fcg1PeriphClockCmd(SPI_CLK, ENABLE); (void)SPI_StructInit(&stcspiinit); stcspiinit.u32WireMode = SPI_4_WIRE; stcspiinit.u32TransMode = SPI_SEND_ONLY;//有两种模式,都可以 stcspiinit.u32MasterSlave = SPI_MASTER; stcspiinit.u32Parity = SPI_PARITY_INVD; stcspiinit.u32SpiMode = SPI_MD_0;//不能够时MD_0 stcspiinit.u32BaudRatePrescaler = SPI_BR_CLK_DIV64; stcspiinit.u32DataBits = SPI_DATA_SIZE_8BIT; stcspiinit.u32FirstBit = SPI_FIRST_MSB; stcspiinit.u32FrameLevel = SPI_1_FRAME; (void)SPI_Init(SPI_UNIT, &stcspiinit);
-
- SPI_config
static uint8_t data[1]={0};//全局数组,用来存放要放出去的数据 void SPI_Config(void) { stc_gpio_init_t stcGpioInit; stc_spi_init_t stcspiinit; stc_irq_signin_config_t stcIrqSignConfig; stc_dma_init_t stcDmaInit; #if(Use_SPI_Software==0) /* Configuration SPI */ (void)GPIO_StructInit(&stcGpioInit); stcGpioInit.u16PinDrv = PIN_HIGH_DRV; stcGpioInit.u16PinInputType = PIN_IN_TYPE_CMOS; (void)GPIO_Init(CS2_PORT , CS2_PIN, &stcGpioInit); (void)GPIO_Init(MISO_PORT,MISO_PIN, &stcGpioInit); (void)GPIO_Init(SCK2_PORT, SCK2_PIN, &stcGpioInit); (void)GPIO_Init(SDIN_PORT , SDIN_PIN, &stcGpioInit); /* Configure Port */ GPIO_SetFunc(CS2_PORT, CS2_PIN, CS_FUNC); GPIO_SetFunc(SCK2_PORT, SCK2_PIN, SCK_FUNC); GPIO_SetFunc(SDIN_PORT, SDIN_PIN, MOSI_FUNC); GPIO_SetFunc(MISO_PORT, MISO_PIN, MISO_FUNC); /* Peripheral clock enable */ FCG_Fcg1PeriphClockCmd(SPI_CLK, ENABLE); (void)SPI_StructInit(&stcspiinit); stcspiinit.u32WireMode = SPI_4_WIRE; stcspiinit.u32TransMode = SPI_SEND_ONLY; stcspiinit.u32MasterSlave = SPI_MASTER; stcspiinit.u32Parity = SPI_PARITY_INVD; stcspiinit.u32SpiMode = SPI_MD_0; stcspiinit.u32BaudRatePrescaler = SPI_BR_CLK_DIV64; stcspiinit.u32DataBits = SPI_DATA_SIZE_8BIT; stcspiinit.u32FirstBit = SPI_FIRST_MSB; stcspiinit.u32FrameLevel = SPI_1_FRAME; (void)SPI_Init(SPI_UNIT, &stcspiinit); #endif #if(Use_SPI_DMA==1) /* DMA configuration */ FCG_Fcg0PeriphClockCmd(DMA_CLK, ENABLE); FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_AOS, ENABLE); (void)DMA_StructInit(&stcDmaInit); stcDmaInit.u32BlockSize = 1UL; stcDmaInit.u32TransCount = 1UL; stcDmaInit.u32DataWidth = DMA_DATAWIDTH_8BIT; stcDmaInit.u32SrcAddrInc = DMA_SRC_ADDR_INC;//源地址可变/递增 stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_FIX;//目的地址固定 stcDmaInit.u32SrcAddr = ( uint32_t)(&data[0]); stcDmaInit.u32DestAddr =(uint32_t)(&SPI_UNIT->DR); stcDmaInit.u32IntEn = DMA_INT_ENABLE; (void)DMA_Init(DMA_UNIT, DMA_CH, &stcDmaInit); AOS_SetTriggerEventSrc(DMA_TRIG_CH, SPI_TX_EVT_SRC);//设置其为传输启动触发源。 /* DMA receive NVIC configure */ stcIrqSignConfig.enIntSrc = DMA_INT_SRC; stcIrqSignConfig.enIRQn = DMA_IRQ_NUM; stcIrqSignConfig.pfnCallback = &DMA_TransCompleteCallback;//中断函数 (void)INTC_IrqSignIn(&stcIrqSignConfig); DMA_ClearTransCompleteStatus(DMA_UNIT, DMA_FLAG_TC_CH0 );//清除完成标志 /* NVIC setting */ NVIC_ClearPendingIRQ(stcIrqSignConfig.enIRQn); NVIC_SetPriority(stcIrqSignConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT); NVIC_EnableIRQ(stcIrqSignConfig.enIRQn); /* Enable DMA and channel */ DMA_Cmd(DMA_UNIT, ENABLE); (void)DMA_ChCmd(DMA_UNIT, DMA_CH, ENABLE); // /* Enable SPI */ // SPI_Cmd(SPI_UNIT, ENABLE); #endif }
要源代码和更清除点的版本就去点下面这个链接过去:
【HC32F448测评】SPI_DMA/软件SPI/硬件SPI驱动OLED与SPI驱动OLED无显示原因可能 http://bbs.eeworld.com.cn/thread-1255887-1-1.html
【HC32F448测评】SPI_DMA/软件SPI/硬件SPI驱动OLED与SPI驱动OLED无显示原因可能
最新推荐文章于 2023-10-02 16:40:10 发布