芯源半导体CW32
直播中

lotusp

11年用户 1195经验值
擅长:电源/新能源
私信 关注
[问答]

CW32L010的SPI如何驱动TFT屏幕?时钟如何配置?

如何配置呢,一直没搞定,难道是时钟的问题?示波器观测也有波形。程序在F030上都是好好的。
不知道哪儿的问题,谁弄成了,分享一下看看。

回帖(1)

旧念

6 天前

针对CW32L010驱动TFT屏幕的问题,结合您的描述(在STM32F030正常,CW32L010有波形但显示异常),以下是关键排查步骤和配置建议:




一、SPI配置核心差异点(CW32与STM32对比)




  1. 时钟源配置

    CW32L010的SPI时钟源来自APB总线(PCLK),需确保系统时钟和APB分频正确:


    RCC_AHBPeriphClk_Enable(RCC_AHBPERIPH_GPIOA, ENABLE);  // 使能GPIO时钟
    RCC_APB2PeriphClk_Enable(RCC_APB2PERIPH_SPI1, ENABLE); // 使能SPI时钟

    检查系统时钟初始化(如是否使用HSI/PLL),确认PCLK频率是否符合TFT要求(用示波器测量SCK频率)。




  2. SPI分频设置

    STM32的SPI_BaudRatePrescaler需转换为CW32的等效值:


    SPI_InitStruct.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; // 示例:PCLK/8

    计算示例:若PCLK=48MHz,分频8则SCK=6MHz。




  3. CPOL/CPHA模式

    严格匹配TFT屏时序要求(模式0/1/2/3),示波器检查SCK空闲电平(CPOL)和采样边沿(CPHA):


    SPI_InitStruct.CLKPolarity = SPI_POLARITY_LOW; // CPOL=0
    SPI_InitStruct.CLKPhase = SPI_PHASE_1EDGE;     // CPHA=0 (模式0)





二、关键排查步骤




  1. GPIO配置修复

    CW32的复用功能需显式设置:


    // 配置SPI引脚(以PA5/6/7为例)
    GPIO_Init(GPIOA, GPIO_PIN_5 | GPIO_PIN_7, GPIO_MODE_OUTPUT_PP, GPIO_AF0_SPI1); // MOSI/SCK
    GPIO_Init(GPIOA, GPIO_PIN_4, GPIO_MODE_OUTPUT_PP); // CS引脚(普通GPIO)
    GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_OUTPUT_PP); // DC引脚

    注意GPIO_AF0_SPI1是复用功能编号,需查数据手册确认引脚对应AF编号。




  2. DC/CS时序问题

    确保DC信号在SCK动作前稳定:


    void TFT_SendCommand(uint8_t cmd) {
       GPIO_ResetBits(GPIOA, GPIO_PIN_3); // DC=命令
       GPIO_ResetBits(GPIOA, GPIO_PIN_4); // CS=0
       SPI_SendData(SPI1, cmd);
       while (!SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE)); // 等待发送完成
       GPIO_SetBits(GPIOA, GPIO_PIN_4); // CS=1
    }

    重要:用示波器同步抓取SCK、DC、CS,确认DC在SCK第一个边沿前已稳定。




  3. SPI发送函数优化

    CW32需等待TXE标志后写入数据:


    void SPI_SendByte(uint8_t data) {
       while (SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET); // 等待发送缓冲区空
       SPI_SendData(SPI1, data);
    }





三、完整SPI初始化代码(CW32L010)


void SPI_Init(void) {
    SPI_InitType SPI_InitStruct = {0};

    // 1. 使能时钟
    RCC_AHBPeriphClk_Enable(RCC_AHBPERIPH_GPIOA, ENABLE);
    RCC_APB2PeriphClk_Enable(RCC_APB2PERIPH_SPI1, ENABLE);

    // 2. 配置GPIO
    GPIO_Init(GPIOA, GPIO_PIN_5 | GPIO_PIN_7, GPIO_MODE_OUTPUT_PP, GPIO_AF0_SPI1); // SCK/MOSI
    GPIO_Init(GPIOA, GPIO_PIN_4, GPIO_MODE_OUTPUT_PP); // CS
    GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_OUTPUT_PP); // DC

    // 3. SPI参数设置
    SPI_InitStruct.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;   // 根据PCLK调整
    SPI_InitStruct.CLKPolarity       = SPI_POLARITY_LOW;          // CPOL=0
    SPI_InitStruct.CLKPhase          = SPI_PHASE_1EDGE;           // CPHA=0
    SPI_InitStruct.FirstBit          = SPI_FIRSTBIT_MSB;          // 高位先行
    SPI_InitStruct.Mode              = SPI_MODE_MASTER;           // 主机模式
    SPI_InitStruct.DataWidth         = SPI_DATAWIDTH_8BIT;        // 8位数据
    SPI_InitStruct.CRCCalculation    = SPI_CRCCALCULATION_DISABLE;
    SPI_InitStruct.NSS               = SPI_NSS_SOFT;              // 软件控制NSS
    SPI_Init(SPI1, &SPI_InitStruct);

    // 4. 使能SPI
    SPI_Cmd(SPI1, ENABLE);
}



四、调试技巧




  1. 示波器关键检查点



    • SCK频率:是否超过TFT屏最大时钟(如ILI9341通常限10MHz)。

    • DC/CS时序:在SCK有效边沿前,DC信号必须稳定至少几十ns。

    • MOSI数据对齐:是否在正确的SCK边沿采样(模式0:SCK第一个上升沿采样)。




  2. 简化测试


    // 发送固定测试序列(如0xAA/0x55)
    while(1) {
       TFT_SendCommand(0xAA);
       TFT_SendData(0x55);
       Delay_ms(500);
    }

    通过示波器观察MOSI数据是否与预期一致。




  3. 常见错误原因



    • CW32的GPIO复用功能配置错误(AF编号不对)。

    • SPI分频寄存器配置偏差(如实际分频值不符预期)。

    • TFT屏复位未完成(上电后需延时>100ms再初始化)。






五、参考解决方案


已成功驱动ILI9341的CW32L010核心配置(库函数版):

GitHub示例

(包含完整初始化序列与硬件连接图)


若仍不工作,请提供以下信息进一步排查:



  1. TFT屏幕型号及数据手册

  2. 实测SCK/MOSI/DC波形图

  3. 系统时钟配置代码(SystemClock_Config()

举报

更多回帖

发帖
×
20
完善资料,
赚取积分