[技术问答]

请问NUC123硬件SPI0无法驱动OLED(SH1106)

[复制链接]
794|6
手机看帖
扫描二维码
随时随地手机跟帖
风来吴山|  楼主 | 2020-5-28 16:23 | 显示全部楼层 |阅读模式
时钟初始化
    /* Select HCLK as the clock source of SPI0 */
    CLK_SetModuleClock(SPI0_MODULE, CLK_CLKSEL1_SPI0_S_HCLK, MODULE_NoMsk);
    /* Enable SPI0 peripheral clock */
    CLK_EnableModuleClock(SPI0_MODULE);
PIN初始化,没有使用PC2(MISO)
/* Setup SPI0 multi-function pins */
    SYS->GPC_MFP &= ~(SYS_GPC_MFP_PC0_Msk | SYS_GPC_MFP_PC1_Msk | SYS_GPC_MFP_PC3_Msk);        // SYS_GPC_MFP_PC2_Msk
    SYS->GPC_MFP |= SYS_GPC_MFP_PC0_SPI0_SS0 | SYS_GPC_MFP_PC1_SPI0_CLK | SYS_GPC_MFP_PC3_SPI0_MOSI0;        // SYS_GPC_MFP_PC2_SPI0_MISO0
    SYS->ALT_MFP &= ~(SYS_ALT_MFP_PC0_Msk | SYS_ALT_MFP_PC1_Msk | SYS_ALT_MFP_PC3_Msk);        // SYS_ALT_MFP_PC2_Msk
    SYS->ALT_MFP |= SYS_ALT_MFP_PC0_SPI0_SS0 | SYS_ALT_MFP_PC1_SPI0_CLK | SYS_ALT_MFP_PC3_SPI0_MOSI0;        // SYS_ALT_MFP_PC2_SPI0_MISO0
SPI0配置
void SPI0_Init(void)
{
        SPI_Open(SPI0, SPI_MASTER, SPI_MODE_0, 0, 9000000);
        SPI_EnableAutoSS(SPI0, SPI_SS0, SPI_SS_ACTIVE_LOW);
}
OLED读写
#ifdef SOFT_SPI
void OLED_WR_Byte(u8 dat,u8 cmd)
{
        u8 i;
        if(cmd)
          OLED_DC_Set();
        else
          OLED_DC_Clr();
        OLED_CS_Clr();
        for(i = 0; i < 8; i++)
        {
                OLED_SCL_Clr();
                if(dat & 0x80)
                   OLED_SDA_Set();
                else
                   OLED_SDA_Clr();
                OLED_SCL_Set();
                dat <<= 1;
        }
        OLED_CS_Set();
        OLED_DC_Set();
}
#else
void OLED_WR_Byte(u8 dat, u8 cmd)
{
        if(cmd)
          OLED_DC_Set();
        else
          OLED_DC_Clr();
        SPI_WRITE_TX0(SPI0, dat);
        OLED_DC_Set();
}
#endif
main函数
#ifdef SOFT_SPI
    SPI0_Init_Soft();
#else
    SPI0_Init();
#endif
        delay_ms(100);
        OLED_Init();
UART_SetTimeoutCnt(UART0, 40);
        UART0->FCR |= (3 << 4);                // 设置UART0的串口FIFO为14字节
        UART_EnableInt(UART0, (UART_IER_RDA_IEN_Msk | UART_IER_RTO_IEN_Msk));
    printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %dHz\n", SystemCoreClock);
    printf("\n\nUART Sample Program\n");
        t1.IDString = (uint8_t*)"LCC1 V0.0.1";
        printf("please input data:\n");
        delay_ms(500);
        AD5764_Init();
        while(1)
    {
                OLED_Refresh();
        OLED_ShowString(0, 1, t1.IDString, 16, 1);
    }

如果我使用软件模拟SPI,屏幕可以点亮且正常显示,一旦使用硬件SPI0,则不行,起初我以为是SPI的模式、bit数不对,但SPI_MODE_0到SPI_MODE_3,bit数8和32都试过了,还是点不亮,求做过的大佬指点一下吧。急急急。

使用特权

评论回复
风来吴山|  楼主 | 2020-5-28 16:24 | 显示全部楼层
SPI_Open(SPI0, SPI_MASTER, SPI_MODE_0, 8, 9000000);
这里更正一下

使用特权

评论回复
风来吴山|  楼主 | 2020-5-28 17:06 | 显示全部楼层
解决了,是OLED_WR_Byte函数写的有问题,正确的写法如下:
void OLED_WR_Byte(u8 dat, u8 cmd)
{
        int timeout = 25000;
        if(cmd)
          OLED_DC_Set();
        else
          OLED_DC_Clr();
        SPI_WRITE_TX0(SPI0, dat);
        SPI_TRIGGER(SPI0);
        while (SPI_IS_BUSY(SPI0))
        {
                if(!timeout--){}
        }
        OLED_DC_Set();
}

使用特权

评论回复
jiekou001| | 2020-5-28 19:06 | 显示全部楼层
感谢楼主分享宝贵经验。

使用特权

评论回复
jerow| | 2020-5-28 22:22 | 显示全部楼层
感谢分享,一般来说,不要怀疑硬件的问题,都是操作底层函数导致的。

使用特权

评论回复
捉虫天师| | 2020-5-29 11:32 | 显示全部楼层
硬件一般不会有问题,分享的不错。

使用特权

评论回复
598330983| | 2020-5-29 20:47 | 显示全部楼层
太棒了,学习学习

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

40

帖子

1

粉丝