【HC32F448测评】SPI_DMA/软件SPI/硬件SPI驱动OLED与SPI驱动OLED无显示原因可能

  1. 上一篇的SPI软硬件驱动OLED的测评篇硬件SPI的解决办法
    1. 上一篇说到硬件SPI无法驱动OLED显示的现象,而且SPI似乎比较慢,经过几天的研究终于解决的了问题,先说结论,代码没问题,解决办法是在SPI的CS SCK MOIS(或者叫SDIN)这三根线上串一个100R电阻,用来维持SPI的波形(原来有可能是因为SPI速度太快导致信号串扰),而在开发板上工程师也已经把100R给串好了(因为一开始懒得找这个口,丝印不好找
  2. 关于SPI的另外一些补充:如果按上一篇的SPI的配置方法配置SPI,WireMode必须是4线制,SpiMode不能是MD_1,如果要用MD_1就要更改其他配置了,此外MD_2,MD_3都可以直接用。
    1. 		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);
      
  3. 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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值