硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1222|回复: 9
收起左侧

[技术讨论] 使用SPI来驱动HT1620,芯片和HT1621类似

[复制链接]

23

主题

49

回帖

118

积分

初级会员

积分
118
发表于 2024-7-9 08:56:16 | 显示全部楼层 |阅读模式
各位大佬们好,作为一个小白,想问一个问题。
板子还没画好,现在需要先用Demo板试试这个断码屏,我现在不知道怎么接线,和他的原理图对不上,Demo板上spi1是PB3,PB4,PB5,但是图片上标出的SCK是PA5
,应该怎么接线的?断码屏使用的是HT1620的和HT1621差不多,但是用的是spi接口的,如何驱动起来呢?




微信图片_20240709085425.png
微信图片_20240709085431.png

HT1620 中文使用指南.pdf

280.58 KB, 下载次数: 4

SMS2813使用说明书.pdf

625.6 KB, 下载次数: 4

回复

使用道具 举报

9

主题

66

回帖

108

积分

初级会员

积分
108
发表于 2024-7-9 09:50:17 | 显示全部楼层
CubeMX右边引脚图上,点PA5,选SPI1_SCK。
回复

使用道具 举报

9

主题

66

回帖

108

积分

初级会员

积分
108
发表于 2024-7-9 10:09:28 | 显示全部楼层
看这奇葩读时序,不是SPI的。但是写时序似乎可以使用SPI Half-Duplex Master半双工模式来实现。
回复

使用道具 举报

23

主题

49

回帖

118

积分

初级会员

积分
118
 楼主| 发表于 2024-7-9 16:15:13 | 显示全部楼层
egoistaw 发表于 2024-7-9 10:09
看这奇葩读时序,不是SPI的。但是写时序似乎可以使用SPI Half-Duplex Master半双工模式来实现。

你好,两个CS引脚应该怎么定义呢?一个用cubemx中的Hardware NSS output Single默认的片选引脚,另一个呢?自己随便设置一个吗?
下载.png
回复

使用道具 举报

7

主题

146

回帖

167

积分

初级会员

积分
167
发表于 2024-7-9 16:25:12 | 显示全部楼层
网上找找一大堆资料
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116230
QQ
发表于 2024-7-9 17:39:50 | 显示全部楼层
zhouyalong 发表于 2024-7-9 16:15
你好,两个CS引脚应该怎么定义呢?一个用cubemx中的Hardware NSS output Single默认的片选引脚,另一个呢 ...

随意GPIO控制高低电平
回复

使用道具 举报

9

主题

66

回帖

108

积分

初级会员

积分
108
发表于 2024-7-9 17:49:06 | 显示全部楼层
zhouyalong 发表于 2024-7-9 16:15
你好,两个CS引脚应该怎么定义呢?一个用cubemx中的Hardware NSS output Single默认的片选引脚,另一个呢 ...

不要使用硬件控制NSS,自己手动用两个GPIO控NSS;我看了似乎SPI只发送就可以了,所以使用Transmit Only Master也行。SMS2813里告诉你了,CS1 CS2控制下哪些地址里的数据对应哪几个亮点。HT1620告诉你往地址里写数据要按照什么格式发。
回复

使用道具 举报

23

主题

49

回帖

118

积分

初级会员

积分
118
 楼主| 发表于 2024-7-10 09:13:10 | 显示全部楼层
egoistaw 发表于 2024-7-9 17:49
不要使用硬件控制NSS,自己手动用两个GPIO控NSS;我看了似乎SPI只发送就可以了,所以使用Transmit Only M ...

大佬,我用软件模拟spi写完后,段码屏能显示,然后用硬件配置完后,把相应的函数修改成用硬件的后,显示屏不显示东西了,能看一下我的是什么问题吗?是不是有些函数没有修改对?



[C] 纯文本查看 复制代码
#include "lcd.h"
#include "gpio.h"
#include "spi.h"

#define _lcd_cs1_dis HAL_GPIO_WritePin(CS1_GPIO_Port, CS1_Pin, GPIO_PIN_SET)
#define _lcd_cs1_en HAL_GPIO_WritePin(CS1_GPIO_Port, CS1_Pin, GPIO_PIN_RESET)
#define _lcd_cs2_dis HAL_GPIO_WritePin(CS2_GPIO_Port, CS2_Pin, GPIO_PIN_SET)
#define _lcd_cs2_en HAL_GPIO_WritePin(CS2_GPIO_Port, CS2_Pin, GPIO_PIN_RESET)
#define _spiMOSI_set HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET)
#define _spiMOSI_clr HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET)

SMS2813_MAP_TypeDef lcdRam;

static int pinConfigLcd(void)
{
    MX_GPIO_Init();
    // lcd管脚配置
    //   _lcd_cs1_w;
    _lcd_cs1_dis;
    //   _lcd_cs2_w;
    _lcd_cs2_dis;
    //   _spiMOSI_dir;
    _spiMOSI_clr;
    //   _spiSCK_dir;
    // _spiSCK_set;

    return _OK;
}

static int setLcdCs(uint8 page, uint8 sta)
{
    // _lcd_cs1_w;
    // _lcd_cs2_w;

    switch (page)
    {
    case _LOW32:
        if (sta == _EN)
        {
            _lcd_cs1_en;
            _lcd_cs2_dis;
        }
        else
            _lcd_cs1_dis;

        break;
    case _HIGH32:
        if (sta == _EN)
        {
            _lcd_cs2_en;
            _lcd_cs1_dis;
        }
        else
            _lcd_cs2_dis;
        break;

    default:
        _lcd_cs1_dis;
        _lcd_cs2_dis;
        break;
    }
    return _OK;
}

//软件SPI
// static int wrLcdSerialData(uint16 dat, uint8 num)
// {
//     int i;
//     for (i = 0; i < num; i++)
//     {
//         if (dat & (0x8000 >> i))
//             _spiMOSI_set;
//         else
//             _spiMOSI_clr;
//         _spiSCK_clr;
//         HAL_Delay(1);
//         _spiSCK_set;
//     }
//     return num;
// }

//硬件spi
static int wrLcdSerialData(uint16 dat, uint8 num)
{
    HAL_SPI_Transmit(&hspi1, (uint8_t *)&dat, num, 100);
    return num;
}

uint8 wrLcdCommand(uint16 command, uint8 pag)
{
    LCD_WORD_TypeDef dat;

    //   _spiSCK_dir;
    // _spiSCK_set;
    //   _spiMOSI_dir;
    // _spiMOSI_set;

    setLcdCs(pag, _EN);

    dat.COMMAND.lcdCommand = command & 0x1ff;
    dat.COMMAND.lcdCtr = W_COMMAND;

    wrLcdSerialData(dat.data, 12);

    setLcdCs(pag, _DIS);
    // _spiMOSI_set;
    return _OK;
}

int32 lcd_init(uint8_t full)
{
    // 管脚配置
    pinConfigLcd();

    // 启动bais 1/3,COMM 4
    wrLcdCommand(LCD_SET_BAIS_COM + LCD_BAIS_1_3 + LCD_COM_4, _LOW32);
    wrLcdCommand(LCD_SET_BAIS_COM + LCD_BAIS_1_3 + LCD_COM_4, _HIGH32);
    HAL_Delay(200);
    // 打开系统振荡器
    wrLcdCommand(LCD_SYS_EN, _LOW32);
    wrLcdCommand(LCD_SYS_EN, _HIGH32);
    HAL_Delay(200);

    // 开显示
    wrLcdCommand(LCD_ON, _LOW32);
    wrLcdCommand(LCD_ON, _HIGH32);
    HAL_Delay(200);
    if (full)
    {
        // 清屏
        clearLcd();
        lcd_full();
    }
    return _OK;
}

int lcd_full(void)
{
    wrLcdCommand(LCD_SET_BAIS_COM + LCD_BAIS_1_3 + LCD_COM_4, _LOW32);
    printLcdPage((const uint32 *)(&lcdRam.cs1Data), _LOW32);
    wrLcdCommand(LCD_SET_BAIS_COM + LCD_BAIS_1_3 + LCD_COM_4, _HIGH32);
    printLcdPage((const uint32 *)(&lcdRam.cs2Data), _HIGH32);

    return _OK;
}

//软件
// int printLcdPage(const uint32 *dat, uint8 pag)
// {
//     int i, j;
//     LCD_WORD_TypeDef idat;

//     //   _spiSCK_dir;
//     // _spiSCK_set;
//     //   _spiMOSI_dir;
//     _spiMOSI_set;
//     setLcdCs(pag, _EN);

//     // 发送b101A5A4A3A2A0
//     idat.DATA.lcdCtr = W_DATA;
//     idat.DATA.lcdAddr = 0;
//     wrLcdSerialData(idat.data, 9);

//     for (i = 0; i < 4; i++)
//     {
//         for (j = 0; j < 32; j++)
//         {
//             // if (!(j & 0x7))
//             //     HAL_Delay(1);
//             if (dat[i] & (1ul << j))
//                 _spiMOSI_set;
//             else
//                 _spiMOSI_clr;
//             _spiSCK_clr;
//             // __NOP;
//             HAL_Delay(1);
//             _spiSCK_set;
//         }
//     }
//     setLcdCs(pag, _DIS);
//     _spiMOSI_set;

//     return _OK;
// }

//硬件
int printLcdPage(const uint32 *dat, uint8 pag)
{
    int i, j;
    LCD_WORD_TypeDef idat;

    setLcdCs(pag, _EN);

    // 发送b101A5A4A3A2A0
    idat.DATA.lcdCtr = W_DATA;
    idat.DATA.lcdAddr = 0;
    wrLcdSerialData(idat.data, 9);

    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 32; j++)
        {
            uint16_t dataToSend = (dat[i] & (1ul << j)) ? 1 : 0;
            wrLcdSerialData(dataToSend, 1);
        }
    }
    setLcdCs(pag, _DIS);

    return _OK;
}

int setLcd(void)
{
    memset(&lcdRam.cs1Data, 0xFFFFFFFF, sizeof(lcdRam.cs1Data));
    memset(&lcdRam.cs2Data, 0xFFFFFFFF, sizeof(lcdRam.cs2Data));

    return _OK;
}

int clearLcd(void)
{

    memset(&lcdRam.cs1Data, 0, sizeof(lcdRam.cs1Data));
    memset(&lcdRam.cs2Data, 0, sizeof(lcdRam.cs2Data));

    return _OK;
}


回复

使用道具 举报

7

主题

146

回帖

167

积分

初级会员

积分
167
发表于 2024-7-12 11:17:57 | 显示全部楼层
zhouyalong 发表于 2024-7-10 09:13
大佬,我用软件模拟spi写完后,段码屏能显示,然后用硬件配置完后,把相应的函数修改成用硬件的后,显示 ...

需要帮忙吗,有偿帮助
回复

使用道具 举报

7

主题

146

回帖

167

积分

初级会员

积分
167
发表于 2024-7-12 11:18:48 | 显示全部楼层
zhouyalong 发表于 2024-7-10 09:13
大佬,我用软件模拟spi写完后,段码屏能显示,然后用硬件配置完后,把相应的函数修改成用硬件的后,显示 ...

需要帮忙吗,有偿帮助
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-11 06:02 , Processed in 0.993416 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表