通讯协议概述
截取串口通讯核心部分,指令说明及配置寄存器定义如下:
驱动代码分享
头文件:
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __DGUS_H__
#define __DGUS_H__
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
#define DE_MSG_MIN_LEN 7
#define DE_MSG_MAX_LEN 50
#define DE_ENABLE_CRC16 //启用CRC校验
/* Exported types ------------------------------------------------------------*/
typedef enum
{
EN_ACT_WRITE_REG = 0X80,
EN_ACT_READ_REG = 0X81,
EN_ACT_WRITE_RAM = 0X82,
EN_ACT_READ_RAM = 0X83,
EN_ACT_WRITE_CURVE = 0X84,
EN_ACT_MAX,
} EN_ACT;
typedef enum
{
EN_REG_ADDR_VERSION = 0X00, //DGUS版本号
EN_REG_ADDR_LED_SET = 0X01, //背光亮度控制 0x00-0x40
EN_REG_ADDR_BZ_TIME = 0X02, //蜂鸣器鸣叫,10ms
EN_REG_ADDR_PIC_ID = 0X03, //当前页面ID
EN_REG_ADDR_TP_FLAG = 0X05,
EN_REG_ADDR_TP_STATUS = 0X06, //
EN_REG_ADDR_TP_POSION = 0X07,
EN_REG_ADDR_TPC_ENABLE = 0X0B, // 0x00 触控不启动
EN_REG_ADDR_RUN_TIME = 0X0C,
EN_REG_ADDR_R0_RC = 0X10,
EN_REG_ADDR_LED_STA = 0X1E,
EN_REG_ADDR_RTC_COM_ADJ = 0X1F, //写入0x5A申请修改RTC时间
EN_REG_ADDR_RTC_NOW = 0X20, //读写RTC时间
EN_REG_ADDR_EN_LIB_OP = 0X40, //读写字库
EN_REG_ADDR_LIB_OP_MODE = 0X41,
EN_REG_ADDR_LIB_ID = 0X42,
EN_REG_ADDR_LIB_ADDRESS = 0X43,
EN_REG_ADDR_LIB_VP = 0X46,
EN_REG_ADDR_LIB_OP_LENGTH = 0X48,
EN_REG_ADDR_KEY_CODE = 0X4F, //用户键码
EN_REG_ADDR_PLAY_MUSIC_SET = 0X50,
EN_REG_ADDR_VOLUME_ADJ = 0X53,
EN_REG_ADDR_EN_DBL_OP = 0X56, //读写数据库
EN_REG_ADDR_OP_MODE = 0X57,
EN_REG_ADDR_DBL_ADDRESS = 0X58,
EN_REG_ADDR_VP = 0X5C,
EN_REG_ADDR_OP_LENGTH = 0X5E,
EN_REG_ADDR_SCAN_STATUS = 0XE9,
EN_REG_ADDR_TPCAL_TRIGER = 0XEA, //写入0x5A 触摸屏校准
EN_REG_ADDR_TRENDINE_CLEAR = 0XEB,
EN_REG_ADDR_RESET_TRIGER = 0XEE, //写入 0x5AA5 复位
} EN_REG_ADDR;
typedef enum
{
EN_RAM_ADDR_VP_START = 0X0000,
EN_RAM_ADDR_SP_START = 0X4000,
EN_RAM_ADDR_HW_START = 0X6F00,
}EN_RAM_ADDR;
typedef enum
{
DB_OPER_MODE_WRITE = 0X50,
DB_OPER_MODE_READ = 0XA0,
}DB_OPER_MODE;
extern const uint8_t DGUS_MSG_HEAD[2];
/* Exported functions ------------------------------------------------------- */
extern void DgusPowerReset(void);
extern void DgusGetVer(void);
extern void DgusReadPageNum(void);
extern uint8_t DgusMsgCheck(const uint8_t *pMsg, uint8_t MsgLen);
extern void DgusBeepRing(uint8_t TimeLen);
extern void DgusChangePage(uint16_t PageNum);
extern void DgusKeyCodeSet(uint8_t KeyCode);
extern void DgusOperDataBase(DB_OPER_MODE enMode, uint32_t AddrDB, uint16_t AddrRam, uint16_t Len);
extern uint8_t DgusOperRam(EN_ACT enAct, uint16_t RamAddr, const uint8_t *pBuf, uint8_t BufLen);
#ifdef __cplusplus
}
#endif
#endif
/************************ (C) COPYRIGHT *****END OF FILE****/
源文件:
/**
******************************************************************************
* @file
* @author
* @version
* @date
* @brief
******************************************************************************
* @attention
*****************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "dgus.h"
#include <string.h>
#include <stdint.h>
#include <stdio.h>
#include "lcd_msg.h"
#include "crc16.h"
#include "debug.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/*Private variables ---------------------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
const uint8_t DGUS_MSG_HEAD[2] = {0x5A,0xA5};
/**
* @brief UartMsgCheck
* @param None
* @retval None
*/
uint8_t DgusMsgCheck(const uint8_t *pMsg, uint8_t MsgLen)
{
const uint8_t *pHead = pMsg;
uint8_t CmdLen = pMsg[2];
uint8_t CmdAct = pMsg[3];
if ((MsgLen < DE_MSG_MIN_LEN) || (MsgLen != (CmdLen + sizeof(DGUS_MSG_HEAD) + sizeof(CmdLen))))
{
return 0;
}
if (memcmp(pHead, DGUS_MSG_HEAD, sizeof(DGUS_MSG_HEAD)) != 0)
{
return 0;
}
if (CmdAct >= EN_ACT_MAX) //
{
return 0;
}
#ifdef DE_ENABLE_CRC16
uint8_t DataLen = pMsg[sizeof(DGUS_MSG_HEAD)];
uint16_t ExpectCrcVal = CRC16(pMsg + sizeof(DGUS_MSG_HEAD) + sizeof(uint8_t), DataLen - sizeof(uint16_t));
uint8_t RawCrcL = pMsg[sizeof(DGUS_MSG_HEAD) + sizeof(uint8_t) + DataLen - sizeof(uint16_t)];
uint8_t RawCrcH = pMsg[sizeof(DGUS_MSG_HEAD) + sizeof(uint8_t) + DataLen - sizeof(uint8_t)];
uint16_t RawCrcVal = (RawCrcH << 8) + RawCrcL;
if (ExpectCrcVal != RawCrcVal)
{
return 0;
}
#endif
return 1;
}
/**
* @brief DgusLcdMsgSend
* @param
* @retval
*/
static uint8_t DgusLcdMsgSend(const uint8_t*pBuf, uint8_t BufLen)
{
uint8_t Ret = 0;
uint8_t Index = 0;
uint8_t DateLen = BufLen;
uint8_t SendBuf[DE_MSG_MAX_LEN] = {0};
#ifdef DE_ENABLE_CRC16
uint16_t CrcVal = CRC16(pBuf, BufLen);
uint8_t CrcValL = CrcVal & 0xFF;
uint8_t CrcValH = (CrcVal >> 8) & 0xFF;
DateLen += sizeof(uint16_t);
#endif
memcpy(SendBuf + Index, DGUS_MSG_HEAD, sizeof(DGUS_MSG_HEAD));
Index += sizeof(DGUS_MSG_HEAD);
memcpy(SendBuf + Index, &DateLen, sizeof(DateLen));
Index += sizeof(DateLen);
memcpy(SendBuf + Index, pBuf, BufLen);
Index += BufLen;
#ifdef DE_ENABLE_CRC16
memcpy(SendBuf + Index, &CrcValL, sizeof(uint8_t));
Index += sizeof(uint8_t);
memcpy(SendBuf + Index, &CrcValH, sizeof(uint8_t));
Index += sizeof(uint8_t);
#endif
Ret = LcdMsgSend(SendBuf, Index);
return Ret;
}
/**
* @brief DgusOperRam
* @param
* @retval
*/
uint8_t DgusOperRam(EN_ACT enAct, uint16_t RamAddr, const uint8_t *pBuf, uint8_t BufLen)
{
if (enAct > EN_ACT_READ_RAM)
{
return 0;
}
// DebugPrintf("DgusOperRam,Act = %04x,Addr = %04x\r\n",enAct,RamAddr);
uint8_t Ret = 0;
uint8_t Index = 0;
uint8_t Act = enAct;
uint8_t Buf[DE_MSG_MAX_LEN] = { 0 };
memcpy(Buf + Index, &Act, sizeof(Act));
Index += sizeof(Act);
memcpy(Buf + Index, &RamAddr, sizeof(RamAddr));
Buf[Index] = (RamAddr >> 8) & 0xFF;
Index += 1;
Buf[Index] = RamAddr & 0xFF;
Index += 1;
memcpy(Buf + Index, pBuf, BufLen);
Index += BufLen;
Ret = DgusLcdMsgSend(Buf, Index);
return Ret;
}
//-----------------------------------------------------------------------------------------------------
/**
* @brief DgusOperReg
* @param
* @retval
*/
static uint8_t DgusOperReg(EN_ACT enAct, EN_REG_ADDR enRegAddr, const uint8_t *pBuf, uint8_t BufLen)
{
if (enAct > EN_ACT_READ_REG)
{
return 0;
}
uint8_t Ret = 0;
uint8_t Index = 0;
uint8_t Act = enAct;
uint8_t RegAddr = enRegAddr;
uint8_t Buf[DE_MSG_MAX_LEN] = { 0 };
memcpy(Buf + Index, &Act, sizeof(Act));
Index += sizeof(Act);
memcpy(Buf + Index, &RegAddr, sizeof(RegAddr));
Index += sizeof(RegAddr);
memcpy(Buf + Index, pBuf, BufLen);
Index += BufLen;
Ret = DgusLcdMsgSend(Buf,Index);
return Ret;
}
/**
* @brief 控制蜂鸣器发声
* @param None
* @retval 单位:10ms
*/
void DgusBeepRing(uint8_t TimeLen)
{
DgusOperReg(EN_ACT_WRITE_REG, EN_REG_ADDR_BZ_TIME, &TimeLen, sizeof(TimeLen));
}
/**
* @brief 控制切换界面
* @param None
* @retval 单位:10ms
*/
void DgusChangePage(uint16_t PageNum)
{
uint8_t Buf[2] = { 0 };
Buf[0] = (PageNum >> 8) & 0xFF;
Buf[1] = PageNum & 0xFF;
DgusOperReg(EN_ACT_WRITE_REG, EN_REG_ADDR_PIC_ID, Buf, sizeof(Buf));
}
/**
* @brief DgusKeyCodeSet
* @param None
* @retval None
*/
void DgusKeyCodeSet(uint8_t KeyCode)
{
DgusOperReg(EN_ACT_WRITE_REG, EN_REG_ADDR_KEY_CODE, &KeyCode, sizeof(KeyCode));
}
/**
* @brief
* @param None
* @retval None
*/
void DgusPowerReset(void)
{
uint8_t Buf[] = {0x5A,0xA5};
DgusOperReg(EN_ACT_WRITE_REG, EN_REG_ADDR_RESET_TRIGER, Buf, sizeof(Buf));
}
/**
* @brief
* @param None
* @retval None
*/
void DgusGetVer(void)
{
uint8_t Buf = 0x01;
DgusOperReg(EN_ACT_READ_REG, EN_REG_ADDR_VERSION, &Buf, sizeof(Buf));
}
/**
* @brief 读取当前页面号
* @param None
* @retval
*/
void DgusReadPageNum(void)
{
uint8_t Len = 2;
DgusOperReg(EN_ACT_READ_REG, EN_REG_ADDR_PIC_ID, &Len, sizeof(Len));
}
/**
* @brief
* @param None
* @retval None
*/
void DgusOperDataBase(DB_OPER_MODE enMode, uint32_t AddrDB, uint16_t AddrRam, uint16_t Len)
{
uint8_t Buf[10] = {0};
Buf[0] = 0x5A;
Buf[1] = (uint8_t)enMode;
Buf[2] = (AddrDB >> 24) & 0xFF;
Buf[3] = (AddrDB >> 16) & 0xFF;
Buf[4] = (AddrDB >> 8) & 0xFF;
Buf[5] = (AddrDB >> 0) & 0xFF;
Buf[6] = ((AddrRam >> 8) & 0xFF);
Buf[7] = ((AddrRam >> 0) & 0xFF);
Buf[8] = ((Len >> 8) & 0xFF);
Buf[9] = ((Len >> 0) & 0xFF);
DgusOperReg(EN_ACT_WRITE_REG, EN_REG_ADDR_EN_DBL_OP, Buf, sizeof(Buf));
}
小结
1、代码中串口发送函数及CRC校验函数需用户自己实现。
2、如发现错误及可优化的地方请不吝赐教。