G:\Git_file\YC3121_PT26\Librarier\core\board_config.h
/*
File Name : board_config.h
Author : Yichip
Version : V1.0
Date : 2020/07/17
Description : board I/O config file.
*/
#ifndef __BOARD_CONFIG_H__
#define __BOARD_CONFIG_H__
#include "yc3121.h"
#include "yc_gpio.h"
#include "yc_spi.h"
#include "yc_adc.h"
#include "yc_chrg.h"
//ADC绠¤剼?嶇?
#define ADC_IO_PORT GPIOC
#define ADC1_IO_PIN GPIO_Pin_6
#define ADC2_IO_PIN GPIO_Pin_7
#define ADC3_IO_PIN GPIO_Pin_8
#define ADC4_IO_PIN GPIO_Pin_9
#define ADC_GAP_PIN ADC1_IO_PIN
#define ADC_BM_PIN ADC2_IO_PIN
#define ADC_TM_PIN ADC3_IO_PIN
#define ADC_BAT_BIN ADC4_IO_PIN
#define ADC_CH_GAP ADC_CHANNEL_1
#define ADC_CH_BM ADC_CHANNEL_2
#define ADC_CH_TM ADC_CHANNEL_3
#define ADC_CH_BAT ADC_CHANNEL_4
//DEBUG涓插彛閰?
#define UARTBAUD 115200
#define UART0_TX_PORT GPIOA
#define UART0_TX_PIN GPIO_Pin_1
#define UART0_RX_PORT GPIOA
#define UART0_RX_PIN GPIO_Pin_0
//TPH SPI IO
#define TPH_SPI SPI0
#define TPH_SPI_CLK_PORT GPIOB
#define TPH_SPI_CLK_PIN GPIO_Pin_14
#define TPH_SPI_MOSI_PORT GPIOB
#define TPH_SPI_MOSI_PIN GPIO_Pin_13
#define TPH_SPI_CS_PORT GPIOB
#define TPH_SPI_CS_PIN GPIO_Pin_15
#define TPH_STB1_PORT GPIOB
#define TPH_STB1_PIN GPIO_Pin_12 //加热
#define TPH_STB2_PORT GPIOB
#define TPH_STB2_PIN GPIO_Pin_11 //加热
#define TPH_MDEN_PORT GPIOC
#define TPH_MDEN_PIN GPIO_Pin_0
//FLASH SPI_FLASH IO
#define FLASH_SPI SPI1
#define FLASH_SPI_MOSI_PORT GPIOC
#define FLASH_SPI_MOSI_PIN GPIO_Pin_3
#define FLASH_SPI_MISO_PORT GPIOC
#define FLASH_SPI_MISO_PIN GPIO_Pin_5
#define FLASH_SPI_CLK_PORT GPIOC
#define FLASH_SPI_CLK_PIN GPIO_Pin_2
#define FLASH_SPI_CS_PORT GPIOC
#define FLASH_SPI_CS_PIN GPIO_Pin_4
#ifdef USE_LCD_IIC_PORT
//LCD I2C IO
#define LCD_IIC_SDA_PORT GPIOA
#define LCD_IIC_SDA_PIN GPIO_Pin_5
#define LCD_IIC_CLK_PORT GPIOA
#define LCD_IIC_CLK_PIN GPIO_Pin_4
#define LCD_RST_PORT GPIOA
#define LCD_RST_PIN GPIO_Pin_3
#define LCD_CS_PORT GPIOA
#define LCD_CS1_PIN GPIO_Pin_2
//#define LCD_PWR_PORT GPIOB
//#define LCD_PWR_PIN GPIO_Pin_0
#else
#define LCD_SDA_PORT GPIOA
#define LCD_SDA_PINT GPIO_Pin_5
#define LCD_CLK_PORT GPIOA
#define LCD_CLK_PIN GPIO_Pin_4
#define LCD_RST_PORT GPIOA
#define LCD_RST_PIN GPIO_Pin_3 //
#define LCD_CS_PORT GPIOA
#define LCD_CS1_PIN GPIO_Pin_2 // (没有用)
//#define LCD_DC_PORT GPIOA
//#define LCD_DC_PIN GPIO_Pin_15 //rxid -----------rfid
//#define LCD_PWR_PORT GPIOB
//#define LCD_PWR_PIN GPIO_Pin_0 //gap_e3 --------
#endif
#define Head_En_PORT GPIOA
#define Head_En_PIN GPIO_Pin_12 //head_en
//STEP MOTOR
#define STEP_MOTOR_A1_PORT GPIOC
#define STEP_MOTOR_A1_PIN GPIO_Pin_1
#define STEP_MOTOR_A2_PORT GPIOC
#define STEP_MOTOR_A2_PIN GPIO_Pin_10
#define STEP_MOTOR_B1_PORT GPIOC
#define STEP_MOTOR_B1_PIN GPIO_Pin_12
#define STEP_MOTOR_B2_PORT GPIOC
#define STEP_MOTOR_B2_PIN GPIO_Pin_11
#define STEP_MOTOR_EN_PORT GPIOA
#define STEP_MOTOR_EN_PIN GPIO_Pin_11
#define TPH_POWER_EN_PORT GPIOA
#define TPH_POWER_EN_PIN GPIO_Pin_11
// SERSOR IO
// 测试纸张位置的传感器
#define gap_e3_port GPIOB
#define gap_e3_pin GPIO_Pin_0 //gap_e3
#define gap_e2_port GPIOB
#define gap_e2_pin GPIO_Pin_5 //gap_e2
#define BM_E0_PORT GPIOB
#define BM_E0_PIN GPIO_Pin_6 //gap_e1
#define BM_E1_PORT GPIOB
#define BM_E1_PIN GPIO_Pin_10 //gap_e0
#define KEY_WAKE_PORT GPIOA
#define KEY_WAKE_PIN GPIO_Pin_13
#define KEY_SET_PORT GPIOA
#define KEY_SET_PIN GPIO_Pin_7
#define SYS_POWER_EN_PORT GPIOA //上电输出高
#define SYS_POWER_EN_PIN GPIO_Pin_9
//CHARGE-GET
#define PIN_CHARGE_STATE GPIO_Pin_8
#define PORT_CHARGE_STATE GPIOA
//#define SysTimerInt TIMER4_IRQHandler
//#define PrtTimerInt TIMER3_IRQHandler
//#define LFMotorInt TIMER2_IRQHandler
#endif
// api_ui_led.c
/******************************************************************************
版权所有: 深圳市。。科技有限公司
文件名: api_ui_led.c
作者: wangdy
创建日期: 2021/06/2
描述: led显示控制
其它:
修改历史: //修改历史记录列表,每条修改记录应包含修改日期、修改者及修改内容简述
序号 修改时间 修改人 修改内容
参考样式
******************************************************************************/
/************************************头文件************************************/
//#include "api_ui_process.h"
//#include "printerConfig.h"
#include "bsp_lcd.h"
#include "api_ui_lcd.h"
#include "LcdMenu.h"
/*
#include "api_ui_main.h"
#include "api_ui_macaddr.h"
#include "api_ui_update.h"
#include "api_ui_language_choice.h"
#include "api_ui_selftest_print.h"
#include "api_ui_auto_poweroff.h"
#include "api_ui_firmware_version.h"
#include "api_ui_poweroff_charge.h"
#include "api_ui_factory_setting.h"
#include "api_ui_carriage_open.h"
#include "api_ui_datatrans.h"
#include "api_ui_paper_type.h"
#include "api_ui_auto_calibrate.h"
#include "api_ui_language.h"
#include "yc_systick.h"
#include "api_font_img.h"
#include <stdio.h>
#include <string.h>
#include "api_keyscan.h"
#include "var_global.h"
#include "printerConfig.h"
#include "api_userpara.h"
#include "api_powerctrl.h"
*/
#define UI_LCD
#ifdef UI_LCD
/*************************************宏定义*************************************/
/*************************************变量*************************************/
ST_UI_HANDLE Current_Handle;
UICommonStoreTypeDef UICommonStore = {0}; //存储参数信息
UICommonTypeDef UICommon = //界面通用信息
{
.Last_MenuID = 1, //默认转第一个界面
};
/*************************************函数*************************************/
/*******************************************************************************
* 名称: UI_Menu_ShowChinese_16x16
* 描述: 显示文本 16*16
* 输入参数: 无
* 输出参数: 无
* 其它:
*******************************************************************************/
void UI_Menu_ShowChinese_16x16(uint8_t x,uint8_t y,uint8_t *chinese)
{
uint8_t i = 0;
uint8_t chinese_buf[2]; //汉字数组信息
uint8_t index = x;
uint8_t *font_ptr; //汉字指针
for(i=0; i<strlen((char *)chinese)/2; i++)
{
//取到汉字字模的位置
chinese_buf[0] = chinese[i*2 + 0];
chinese_buf[1] = chinese[i*2 + 1];
//取到字模信息
font_ptr = Get_FontChinese_16x16(chinese_buf);
//LCD显示
if(font_ptr != NULL)
{
LCD_Display_Chinese_16x16(index,y,font_ptr);
index += 16;
}
}
}
/*******************************************************************************
* 名称: UI_Menu_ShowAscii_16x16
* 描述: 显示ascii 8*16
* 输入参数: 无
* 输出参数: 无
* 其它:
*******************************************************************************/
void UI_Menu_ShowAscii_16x16(uint8_t x,uint8_t y,uint8_t *ascii)
{
uint8_t i = 0;
uint8_t ascii_index = 0; //汉字数组信息
uint8_t index = x;
uint8_t *font_ptr; //汉字指针
for(i=0; i<strlen((char *)ascii); i++)
{
ascii_index = ascii[i];
//取到字模信息
font_ptr = Get_FontAscii_16x16(ascii_index);
//LCD显示
if(font_ptr != NULL)
{
LCD_Display_Ascii_16x16(index,y,font_ptr);
index += 8;
}
}
}
/*******************************************************************************
* 名称: UI_Menu_ShowMenu_16x16
* 描述: 显示菜单信息(用于区分语言)
* 输入参数: 无
* 输出参数: 无
* 其它:
*******************************************************************************/
void UI_Menu_ShowMenu_16x16(uint8_t x,uint8_t y,uint8_t *menu)
{
if(LCD.language==ENGLISH)
{
UI_Menu_ShowAscii_16x16(x,y,menu);
}
if(LCD.language==CHINESE)
{
UI_Menu_ShowChinese_16x16(x,y,menu);
}
}
/*******************************************************************************
* 名称: UI_Menu_ShowChinese_12x12
* 描述: 显示文本 12*12
* 输入参数: 无
* 输出参数: 无
* 其它:
*******************************************************************************/
void UI_Menu_ShowChinese_12x12(uint8_t x,uint8_t y,uint8_t *chinese)
{
uint8_t i = 0;
uint8_t chinese_buf[2]; //汉字数组信息
uint8_t index = x;
uint8_t *font_ptr; //汉字指针
for(i=0; i<strlen((char *)chinese)/2; i++)
{
//取到汉字字模的位置
chinese_buf[0] = chinese[i*2 + 0];
chinese_buf[1] = chinese[i*2 + 1];
//取到字模信息
font_ptr = Get_FontChinese_12x12(chinese_buf);
//LCD显示
if(font_ptr != NULL)
{
LCD_Display_Chinese_12x12(index,y,font_ptr);
index += 12;
}
}
}
/*******************************************************************************
* 名称: UI_Menu_ShowAscii_12x12
* 描述: 显示ascii 6*12
* 输入参数: 无
* 输出参数: 无
* 其它:
*******************************************************************************/
void UI_Menu_ShowAscii_12x12(uint8_t x,uint8_t y,uint8_t *ascii)
{
uint8_t i = 0;
uint8_t ascii_index = 0; //汉字数组信息
uint8_t index = x;
uint8_t *font_ptr; //汉字指针
for(i=0; i<strlen((char *)ascii); i++)
{
ascii_index = ascii[i];
//取到字模信息
font_ptr = Get_FontAscii_12x12(ascii_index);
//LCD显示
if(font_ptr != NULL)
{
LCD_Display_Ascii_12x12(index,y,font_ptr);
index += 6;
}
}
}
/*******************************************************************************
* 名称: UI_Menu_ShowMenu_12x12
* 描述: 显示菜单信息(用于区分语言)
* 输入参数: 无
* 输出参数: 无
* 其它:
*******************************************************************************/
void UI_Menu_ShowMenu_12x12(uint8_t x,uint8_t y,uint8_t *menu)
{
//if(gUserPara.Language == LANGUAGE_EN)
if(LCD.language==ENGLISH)
{
//UI_Menu_ShowAscii_12x12(x,y,menu);
UI_Menu_ShowAscii_12x12(0,y,menu);
}
//else if(gUserPara.Language == LANGUAGE_CN)
else if(LCD.language==CHINESE)
{
UI_Menu_ShowChinese_12x12(x,y,menu);
}
}
/*******************************************************************************
* 名称: UI_Menu_Init
* 描述: UI_Menu初始化
* 输入参数: 无
* 输出参数: 无
* 其它:
*******************************************************************************/
/*
void UI_Menu_Init(void)
{
Current_Handle = UIHandle_Main;
Current_Handle.Init(NULL); //初始化显示信息
}
*/
/*******************************************************************************
* 名称: UI_Menu_OpModeChange
* 描述: UI_Menu
* 输入参数: 无
* 输出参数: 无
* 其它:
*******************************************************************************/
/*
void UI_Menu_OpModeChange(MenuOPModeTypeDef mode, void *param)
{
switch(mode)
{
case OP_MODE_MAIN:
{
Current_Handle = UIHandle_Main;
Current_Handle.Init(NULL); //初始化显示信息
break;
}
case OP_MODE_MACADDR: //MAC
{
Current_Handle = UIHandle_MacAddr;
Current_Handle.Init(NULL); //初始化显示信息
UICommon.Last_MenuID = 7;
break;
}
case OP_MODE_UPDATE: //升级
{
Current_Handle = UIHandle_Update;
Current_Handle.Init(NULL); //初始化显示信息
break;
}
case OP_MODE_LANGUAGECHOICE: //语言选择
{
Current_Handle = UIHandle_LanguageChoice;
Current_Handle.Init(NULL); //初始化显示信息
UICommon.Last_MenuID = 4;
break;
}
case OP_MODE_SELFTEST_PRINT: //打印自检
{
Current_Handle = UIHandle_Selftest_Print;
Current_Handle.Init(NULL); //初始化显示信息
UICommon.Last_MenuID = 1;
break;
}
case OP_MODE_AUTO_POWEROFF: //自动关机
{
Current_Handle = UIHandle_AutoPoweroff;
Current_Handle.Init(NULL); //初始化显示信息
UICommon.Last_MenuID = 5;
break;
}
case OP_MODE_FIRMWARE_VERSION: //固件版本号
{
Current_Handle = UIHandle_Firmware_Version;
Current_Handle.Init(NULL); //初始化显示信息
UICommon.Last_MenuID = 8;
break;
}
case OP_MODE_FACTORY_SETTING: //恢复参数
{
Current_Handle = UIHandle_Factory_Setting;
Current_Handle.Init(NULL); //初始化显示信息
UICommon.Last_MenuID = 6;
break;
}
case OP_MODE_PAPER_TYPE: //纸张类型
{
Current_Handle = UIHandle_PaperType;
Current_Handle.Init(NULL); //初始化显示信息
UICommon.Last_MenuID = 2;
break;
}
case OP_MODE_AUTO_CALIBRATE: //自动定标
{
Current_Handle = UIHandle_AutoCalibrate;
Current_Handle.Init(NULL); //初始化显示信息
UICommon.Last_MenuID = 3;
break;
}
default:
{
break;
}
}
}
*/
/*******************************************************************************
* 名称: UI_StorePara
* 描述: UI配置存参
* 输入参数: 无
* 输出参数: 无
* 其它:
*******************************************************************************/
/*
static void UI_StorePara(void)
{
//跳主界面后 开始存参
1 -定标参数
if(UICommonStore.NeedStoreCaliFlag)
{
UICommonStore.NeedStoreCaliFlag = false;
gCalibratePara.SensorMode = UICommonStore.SensorMode; //纸张类型存储
CalibrateParaWritetoFlash(&gCalibratePara); //写定标参数
}
//2-用户参数
if(UICommonStore.NeedStoreLanguateFlag)
{
UICommonStore.NeedStoreLanguateFlag = false;
UserParaWritetoFlash(&gUserPara);
}
//3-存储定时时间信息
if(UICommonStore.NeedStorePowerOffTimeFlag)
{
UICommonStore.NeedStorePowerOffTimeFlag = false;
gUserPara.AutoPowerOffTimeEnum = UICommonStore.AutoPowerOffTimeEnum;
UserParaWritetoFlash(&gUserPara);
}
}
*/
/*******************************************************************************
* 名称: UI_Menu_Process
* 描述: UI_Menu定时调用
* 输入参数: 无
* 输出参数: 无
* 其它:
*******************************************************************************/
/*
void UI_Menu_Process(void)
{
uint32_t current_count = 0;
static uint32_t last_count = 0;
uint32_t backmain_current_count = 0;
static uint32_t backmain_last_count = 0;
KeyStateTypeEnum key_state_power = 0;
KeyStateTypeEnum key_state_feed = 0;
//----------------跳转主界面计时信息 10MS判断一次
backmain_current_count = SysTick_GetMyTick();
if(backmain_last_count != backmain_current_count)
{
backmain_last_count = backmain_current_count;
if(GlobalVar.Use_Key_Menu_Flag)
{
GlobalVar.UI_ReturnToMain_Count++;
if(GlobalVar.UI_ReturnToMain_Count > LCD_RETURN_MAIN_TIMEOUT)
{
GlobalVar.UI_ReturnToMain_Count = 0;
GlobalVar.Use_Key_Menu_Flag = false;
//跳到主界面去 如果当前非主界面
if(0 != memcmp(&Current_Handle, &UIHandle_Main, sizeof(ST_UI_HANDLE)))
{
UI_Menu_OpModeChange(OP_MODE_MAIN,NULL);
UI_StorePara(); //存参
}
}
}
else
{
GlobalVar.UI_ReturnToMain_Count = 0;
}
}
//-------------------按键刷新
if(false == GlobalVar.Use_Key_Menu_Flag)
{
key_state_power = Key_Get_State(KEY_POWER); //左按键按下后 按键被菜单接管
if(key_state_power == KEY_PRESS_SINGLE)
{
GlobalVar.Use_Key_Menu_Flag = true;
GlobalVar.UI_ReturnToMain_Count = 0; //跳过 计数器清0
AutoPowerOffClear(); //清除关机计数
Current_Handle.KeyEvent(KEY_POWER); //左键处理
AutoPowerOffClear(); //清除关机计数
MyPrintf("PowerKey Pressed\r\n");
}
//MyPrintf("PowerKey,Run to Screen\r\n");
}
//进入菜单模式 则进行处理
else if(true == GlobalVar.Use_Key_Menu_Flag)
{
key_state_power = Key_Get_State(KEY_POWER);
key_state_feed = Key_Get_State(KEY_FEED);
if((key_state_power == KEY_RELEASE) && (key_state_feed == KEY_PRESS_SINGLE))
{
GlobalVar.UI_ReturnToMain_Count = 0; //计数清0
Current_Handle.KeyEvent(KEY_FEED); //右键处理
AutoPowerOffClear(); //清除关机计数
}
if((key_state_power == KEY_PRESS_SINGLE) && (key_state_feed == KEY_RELEASE))
{
GlobalVar.UI_ReturnToMain_Count = 0; //计数清0
Current_Handle.KeyEvent(KEY_POWER); //左键处理
AutoPowerOffClear(); //清除关机计数
}
}
// //------------------------定时刷新 更新刷新频率
current_count = SysTick_GetMyTick();
if((current_count - last_count) > LCD_REFRESH_TIME)
{
last_count = current_count;
if((key_state_power == KEY_RELEASE) && (key_state_feed == KEY_RELEASE))
{
Current_Handle.KeyEvent(KEY_NULL); //没按键 则正常做刷新
}
}
}
*/
#endif
// hal.c
/****************************************************************************
* File Name: hal.c
*
* Description:
* hal
*
* --------------------------------------------------------------------
* Revision Author Date Comment
* --------------------------------------------------------------------
* 1.0 Junrong 2021/11/14 Original
*
*****************************************************************************/
#include "hal.h"
#include "yc_trng.h"
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
#include "timers.h"
#include "prtHead.h"
void hal_Init(void)
{
// SuppliseAuth_Init();
}
UINT32 RandomNumber(void)
{
// g_Log.RandomSeed += GetRandomSeed(100) + 1 + rand();
srand(EXT_DEV.bat_adc + xTaskGetTickCount());
return GetTRNGData_8bit() + rand();
}
// hal.h
/****************************************************************************
* File Name: hal.h
*
* Description:
* hal
*
* --------------------------------------------------------------------
* Revision Author Date Comment
* --------------------------------------------------------------------
* 1.0 Junrong 2021/11/14 Original
*
*****************************************************************************/
#ifndef __HAL__
#define __HAL__
#include "Types.h"
#include "yc_timer.h"
void hal_Init(void);
UINT32 RandomNumber(void);
#include "hal_SuppliesAuth.h"
#endif
// hal_SuppliesAuth.c
/****************************************************************************
* File Name: hal_SuppliesAuth.c
*
* Description:
* hal_SuppliesAuth
*
* --------------------------------------------------------------------
* Revision Author Date Comment
* --------------------------------------------------------------------
* 1.0 Junrong 2021/11/14 Original
*
*****************************************************************************/
#include "hal.h"
#include "interface.h"
#include "yc_qspi.h"
#include "yc_trng.h"
#include "app.h"
#define UART_SUPPLIES_AUTH UART1
#define TIMEOUT 10000
#define SUPPLIES_AUTH_PASSWORD "Q2043" //密码
//#define SUPPLIES_AUTH_PASSWORD "12345" //密码
#define RFID_UART_BAUD 9600
void portPTAUTH_CommDataWrite(BYTE addr, BYTE value) //PT26没有用到
{
// taskENTER_CRITICAL();
BYTE buf[2];
buf[0] = addr & 0x3F;
buf[1] = value;
UART_SendData(UART_SUPPLIES_AUTH, buf[0]);
// for(UINT16 i = 0; i < TIMEOUT; i++)
// {
// if(UART_IsRXFIFONotEmpty(UART_SUPPLIES_AUTH))
// {
// buf[0] = UART_ReceiveData(UART_SUPPLIES_AUTH);
// break;
// }
// }
UART_SendData(UART_SUPPLIES_AUTH, buf[1]);
// MyPrintf("W:%02X%02X\r\n", addr, buf[1]);
// taskEXIT_CRITICAL();
}
BYTE portPTAUTH_CommDataRead(BYTE addr) //PT26没有引用
{
volatile uint8_t recv_byte = 0;
// taskENTER_CRITICAL();
//Clear buffer
while(UART_IsRXFIFONotEmpty(UART_SUPPLIES_AUTH))
{
recv_byte = UART_ReceiveData(UART_SUPPLIES_AUTH);
}
// Send address
UART_SendData(UART_SUPPLIES_AUTH, addr | 0x80);
// Receive data
for(UINT16 i = 0; i < TIMEOUT; i++)
{
if(UART_IsRXFIFONotEmpty(UART_SUPPLIES_AUTH))
{
recv_byte = UART_ReceiveData(UART_SUPPLIES_AUTH);
// MyPrintf("R:%02X%02X\r\n", addr, recv_byte);
return recv_byte;
}
}
// taskEXIT_CRITICAL();
// MyPrintf("RF:%02X%02X\r\n", addr | 0x80, recv_byte);
return 0x00;
}
void portPTAUTH_CommSetUartBaudrate(UINT32 baudrate)
{
// taskENTER_CRITICAL();
// MyPrintf("%u\r\n", baudrate);
UART_DeInit(UART_SUPPLIES_AUTH);
UART_InitTypeDef UART_InitStruct;
UART_InitStruct.BaudRate = baudrate;
UART_InitStruct.DataBits = Databits_8b;
UART_InitStruct.StopBits = StopBits_1;
UART_InitStruct.Parity = Parity_None;
UART_InitStruct.FlowCtrl = FlowCtrl_None;
UART_InitStruct.Mode = Mode_duplex;
UART_Init(UART_SUPPLIES_AUTH, &UART_InitStruct);
// taskEXIT_CRITICAL();
}
BYTE portPTAUTH_GenRandomByte(void) //PT26没有引用
{
return RandomNumber();
}
void portPTAUTH_Delay(UINT16 ms) //PT26没有引用
{
delay_ms(ms);
}
#define BLACKLIST_ADDR 0x1078000
void portPTAUTH_BlacklistDataWrite(BYTE *pData, UINT16 length) //PT26没有引用
{
// MyPrintf("BLW(%u):", length);
// for(UINT16 i = 0; i < length; i++)
// {
// MyPrintf("%02X", pData[i]);
// }
// MyPrintf("\r\n");
qspi_flash_blockerase32k(BLACKLIST_ADDR);
qspi_flash_write(BLACKLIST_ADDR, pData, length);
}
void portPTAUTH_BlacklistDataRead(BYTE *pData, UINT16 length) //PT26没有引用
{
// MyPrintf("BLR(%u):", length);
// for(UINT16 i = 0; i < length; i++)
// {
// MyPrintf("%02X", pData[i]);
// }
// MyPrintf("\r\n");
qspi_flash_read(BLACKLIST_ADDR, pData, length);
}
void portPTAUTH_RecordDataWrite(BYTE *pData, UINT16 length) //PT26没有引用
{
SPI_Erase_Sector(LogAddr);
SPI_Write_nBytes(LogAddr, pData, length);
}
void portPTAUTH_RecordDataRead(BYTE *pData, UINT16 length) //PT26没有引用
{
SPI_Read_nBytes(LogAddr, pData, length);
}
void portPTAUTH_DBG(char *pMsg)
{
MyPrintf(pMsg);
}
#define RFID_RESET_LOW (GPIO_ResetBits(PORT_RFID_RESET, PIN_RFID_RESET))
#define RFID_RESET_HIGH (GPIO_SetBits(PORT_RFID_RESET, PIN_RFID_RESET))
#define PIN_RFID_RESET GPIO_Pin_6
#define PORT_RFID_RESET GPIOA
#define PIN_UART1_TX GPIO_Pin_15
#define PORT_UART1_TX GPIOA
#define PIN_UART1_RX GPIO_Pin_14
#define PORT_UART1_RX GPIOA
void SuppliseAuth_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = PIN_RFID_RESET;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(PORT_RFID_RESET, &GPIO_InitStruct);
GPIO_Config(PORT_RFID_RESET, PIN_RFID_RESET, OUTPUT_HIGH);
//复位
(GPIO_SetBits(PORT_RFID_RESET, PIN_RFID_RESET));
delay_ms(50);
(GPIO_ResetBits(PORT_RFID_RESET, PIN_RFID_RESET));
delay_ms(50);
(GPIO_SetBits(PORT_RFID_RESET, PIN_RFID_RESET));
delay_ms(50);
/* Configure serial ports 0 RX and TX for IO. */
GPIO_Config(PORT_UART1_TX, PIN_UART1_TX, UART1_TXD);
GPIO_Config(PORT_UART1_RX, PIN_UART1_RX, UART1_RXD);
UART_InitTypeDef UART_InitStruct;
UART_InitStruct.BaudRate = RFID_UART_BAUD;
UART_InitStruct.DataBits = Databits_8b;
UART_InitStruct.StopBits = StopBits_1;
UART_InitStruct.Parity = Parity_None;
UART_InitStruct.FlowCtrl = FlowCtrl_None;
UART_InitStruct.Mode = Mode_duplex;
UART_Init(UART_SUPPLIES_AUTH, &UART_InitStruct);
TRNG_Init();
PTAuth_Init(SUPPLIES_AUTH_PASSWORD);
// portPTAUTH_CommSetUartBaudrate(9600);
}
BOOL SuppliseAuth_Reset(void)
{
// (GPIO_SetBits(PORT_RFID_RESET, PIN_RFID_RESET));
// vTaskDelay(50);
// (GPIO_ResetBits(PORT_RFID_RESET, PIN_RFID_RESET));
// vTaskDelay(50);
// (GPIO_SetBits(PORT_RFID_RESET, PIN_RFID_RESET));
// vTaskDelay(50);
// PTAuth_Init(SUPPLIES_AUTH_PASSWORD);
}
BOOL SuppliseAuth_Check(UINT32 decLen, UINT32 *pLastLen)
{
ENUM_PTAUTH_ERROR_CODE status;
ENUM_SUPPLIES_TYPE supType = 0;
// for(BYTE i = 0; i < MAX(1, 3); i++)
{
status = PTAuth_Check(decLen, pLastLen, &supType);
// if(status == PTAUTH_NO_ERROR)
// {
// break;
// }
}
// MyPrintf("S:%02X,%02X\r\n", status, *pType);
if(status != PTAUTH_NO_ERROR)
{
return 0;
}
if((supType != SUPPLIES_PT20_SUPPLIES) && (supType != SUPPLIES_PT26_SUPPLIES) && (supType != 9))
{
return 0;
}
return 1;
}
///*******************************************************************************
//* 名称: RFID_Test
//* 描述: RFID 测试
//* 输入参数: 无
//* 输出参数: 无
//* 其它: //400-500byte
//*******************************************************************************/
//void RFID_Test()
//{
// uint32_t curr_count = 0;
// static uint32_t last_count = 0;
//
// #if USE_RFID
// curr_count = SysTick_GetMyTick();
// if(curr_count - last_count > 100)
// {
// last_count = curr_count;
//
// uint32_t temp_len = 0;
// ENUM_PTAUTH_ERROR_CODE errcode = 0;
// ENUM_SUPPLIES_TYPE rfid_type = 0;
//
// errcode = PTAuth_Check(0,&temp_len,&rfid_type); //长度信息
// //MyPrintf("type:%d,errcode:%d,len:%d\r\n",rfid_type,errcode,temp_len);
// }
// #endif
//}
// hal_SuppliesAuth.h
/****************************************************************************
* File Name: hal_SuppliesAuth.h
*
* Description:
* hal_SuppliesAuth
*
* --------------------------------------------------------------------
* Revision Author Date Comment
* --------------------------------------------------------------------
* 1.0 Junrong 2021/11/14 Original
*
*****************************************************************************/
#ifndef __HAL_SUPPLIES_AUTH_H__
#define __HAL_SUPPLIES_AUTH_H__
#include "hal.h"
#include "libPTAuthHF.h"
void SuppliseAuth_Init(void);
BOOL SuppliseAuth_Check(UINT32 decLen, UINT32 *pLastLen);
BOOL SuppliseAuth_Reset(void);
#endif
// Types.h
/****************************************************************************
* File Name: Types.h
*
* Description:
* Type defines
*
* --------------------------------------------------------------------
* Revision Author Date Comment
* --------------------------------------------------------------------
* 1.0 Junrong 2016/02/29 Original
*
*****************************************************************************/
#ifndef __TYPES_H__
#define __TYPES_H__
#include "stdint.h"
typedef uint8_t UINT8, BYTE;
typedef uint16_t UINT16;
typedef uint32_t UINT32;
typedef uint64_t UINT64;
typedef int8_t INT8;
typedef int16_t INT16;
typedef int32_t INT32;
typedef int64_t INT64;
typedef BYTE BOOL;
//#define NULL ((void *)0)
typedef void *HANDLE;
//#define TRUE 1
//#define FALSE 0
#define MIN(a, b) ((((int)a) < ((int)b)) ? (a) : (b))
#define MAX(a, b) ((((int)a) > ((int)b)) ? (a) : (b))
#define ABS(a) (((a) > 0 ) ? (a) : (-a))
#endif
// C:\Users\Administrator\Desktop\PT26_Project\Librarier\core\type.h
/*
File Name : type.h
Author : Yichip
Version : V1.0
Date : 2018/05/25
Description : Data type definition.
*/
#ifndef __TYPE_H__
#define __TYPE_H__
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long long uint64_t;
typedef unsigned char byte;
typedef unsigned short word;
typedef signed char int8_t;
typedef signed short int16_t;
typedef signed int int32_t;
typedef signed long long int64_t;
typedef uint32_t u32;
typedef uint16_t u16;
typedef uint8_t u8;
#define STATIC static
#define DWORD uint32_t
#define WORD uint32_t
#define BYTE uint8_t
#define VOID void
#define INT int32_t
#define UINT uint32_t
#define FLOAT float
#define SHORT int16_t
#define CONST const
typedef struct BitChar {
unsigned B0:1;//固定为1
unsigned B1:1;//固定为0
unsigned B2:1;//正在执行打印
unsigned B3:1;//打印完毕
unsigned B4:1;//打印机有错误(包括:缺纸、上盖、机头过热、写RFID出错);
unsigned B5:1;//暂停状态
unsigned B6:1;//打印内容被取消
unsigned B7:1;//保留
} SBitChar;
typedef struct Bitshort {
unsigned B0: 1;//固定为1
unsigned B1: 1;//固定为0
unsigned B2: 1;//缺纸
unsigned B3: 1;//上盖打开
unsigned B4: 1;//机芯异常
unsigned B5: 1;//打印头过热
unsigned B6: 1;//插入碳带不可识别
unsigned B7: 1;//碳带用尽
unsigned B8: 1;//写RFID出错
unsigned B9: 1;//剪切出错
unsigned B10:1;//打印异常(堵转)
unsigned B11:1;//电池电量过低
unsigned B12:1;//未检测到标签
unsigned B13:1;
unsigned B14:1;
unsigned B15:1;
} SBitshort;
typedef union CharField{
unsigned char byte;
SBitChar field;
} UCharField;
typedef union shortField{
unsigned char byte[2];
SBitshort field;
} UshortField;
#define RCV_TYPE_BLE 0
#define RCV_TYPE_SPP 1
#define RCV_TYPE_USB 2
#define RCV_TYPE_UART 3
#define NO_PAPER 0
#define FULL_PAPER 1
#define GAP_PAPER 2
#define FULL_TO_FULL_PAPER 0x11
#define FULL_TO_GAP_PAPER 0x12
#define GAP_TO_FULL_PAPER 0x21
#define GAP_TO_GAP_PAPER 0x22
#define GAP_ADJ_COUNT_MAX 4
#define POWER_OFF_DELAY 60000
//#define USE_NO_PAPER_DET
#define USE_BLE
#define USE_BAT_DET
//#define USE_PAUSE_KEY
#define USE_LCD
#define USE_PWM_BEEP
#define USE_LCD_IIC_PORT
#ifndef Boolean
typedef enum {FALSE = 0, TRUE = 1} Boolean;
#define IS_BOOLEAN(bool) ((bool == FALSE) || (bool == TRUE))
#endif
#ifndef FunctionalState
typedef enum {DISABLE = 0, ENABLE = 1} FunctionalState;
#define IS_FUNCTIONAL_STATE(state) ((state== DISABLE) || (state == ENABLE))
#endif
#ifndef FunctionalState
typedef enum {ERROR = 0, SUCCESS = 1} ErrorStatus;
#define IS_ERROR_STATE(status) ((status== ERROR) || (status == SUCCESS))
#endif
#ifndef FlagStatus
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
#endif
#endif /*__TYPE_H__*/
// PT26_Project\Librarier\sdk\ yc_ipc.c
#include "yc_ipc.h"
//#define IPC_DEBUG
IPC_TypeDef *IpcRx = (IPC_TypeDef *)(IPC_RX_START_ADDR);
IPC_TypeDef *IpcTx = (IPC_TypeDef *)(IPC_TX_START_ADDR);
uint8_t ipcrecbuf[IPCREVSIZE] = {0};
uint8_t bt_lpm_mode=0;
Boolean IPC_have_data()
{
return HR_REG_16BIT(&IpcRx->ReadPtr) != HR_REG_16BIT(&IpcRx->WrtiePtr) ? TRUE : FALSE;
}
uint16_t IPC_get_available_size()
{
uint16_t retLen=0;
if(bt_lpm_mode==1)
{
WAKEUP_BT |= (1 << WAKEUP_BT_FLAG);
IPC_HOLD_BT = 1;
delay_ms(10);
}
uint16_t readtx = HR_REG_16BIT(&IpcTx->ReadPtr);
uint16_t wrtptr = HR_REG_16BIT(&IpcTx->WrtiePtr);
uint16_t ipcendaddr = HR_REG_16BIT(&IpcTx->IpcEndAddr);
uint16_t ipcstartaddr = HR_REG_16BIT(&IpcTx->IpcStartAddr);
if (readtx > wrtptr)
{
retLen = readtx - wrtptr;
}
else
{
retLen = ((ipcendaddr - ipcstartaddr + 1) - (readtx - wrtptr));
}
if(bt_lpm_mode==1)
{
IPC_HOLD_BT = 0;
WAKEUP_BT &= ~(1 << WAKEUP_BT_FLAG);
}
return retLen;
}
void IPC_TxData(HCI_TypeDef *IpcData)
{
#ifdef IPC_DEBUG
PrintHCIPack(IpcData,"tx");
#endif
if(bt_lpm_mode==1)
{
WAKEUP_BT |= (1 << WAKEUP_BT_FLAG);
IPC_HOLD_BT = 1;
delay_ms(10);
}
uint16_t Wptr = HR_REG_16BIT(&IpcTx->WrtiePtr);
uint16_t Len = IpcData->DataLen + 3;
uint8_t *Rptr = (uint8_t *)IpcData;
while (Len--)
{
HW_IPC_REG_8BIT(Wptr, *Rptr++);
RB_UPDATE_PTR(Wptr, HR_REG_16BIT(&IpcTx->IpcStartAddr), HR_REG_16BIT(&IpcTx->IpcEndAddr));
if (Len == IpcData->DataLen)
Rptr = IpcData->p_data;
}
HW_REG_16BIT(&IpcTx->WrtiePtr, (uint32_t)Wptr);
if(bt_lpm_mode==1)
{
IPC_HOLD_BT = 0;
WAKEUP_BT &= ~(1 << WAKEUP_BT_FLAG);
}
}
Boolean IPC_PutBtData(const void *buf, uint32_t size)
{
if (size == 0 || size > 258)
{
return FALSE;
}
if(bt_lpm_mode==1)
{
WAKEUP_BT |= (1 << WAKEUP_BT_FLAG);
IPC_HOLD_BT = 1;
delay_ms(10);
}
uint16_t Wptr = HR_REG_16BIT(&IpcTx->WrtiePtr);
uint8_t *Rptr = (uint8_t *)buf;
while (size--)
{
HW_IPC_REG_8BIT(Wptr, *Rptr++);
RB_UPDATE_PTR(Wptr, HR_REG_16BIT(&IpcTx->IpcStartAddr), HR_REG_16BIT(&IpcTx->IpcEndAddr));
}
HW_REG_16BIT(&IpcTx->WrtiePtr, (uint32_t)Wptr);
if(bt_lpm_mode==1)
{
IPC_HOLD_BT = 0;
WAKEUP_BT &= ~(1 << WAKEUP_BT_FLAG);
}
return TRUE;
}
Boolean IPC_ReadBtData(HCI_TypeDef *IpcData)
{
if (HR_REG_16BIT(&IpcRx->ReadPtr) != HR_REG_16BIT(&IpcRx->WrtiePtr))
{
uint16_t Rptr = HR_REG_16BIT(&IpcRx->ReadPtr);
IpcData->type = HR_IPC_REG_8BIT(Rptr);
RB_UPDATE_PTR(Rptr, HR_REG_16BIT(&IpcRx->IpcStartAddr), HR_REG_16BIT(&IpcRx->IpcEndAddr));
IpcData->opcode = HR_IPC_REG_8BIT(Rptr);
RB_UPDATE_PTR(Rptr, HR_REG_16BIT(&IpcRx->IpcStartAddr), HR_REG_16BIT(&IpcRx->IpcEndAddr));
IpcData->DataLen = HR_IPC_REG_8BIT(Rptr);
RB_UPDATE_PTR(Rptr, HR_REG_16BIT(&IpcRx->IpcStartAddr), HR_REG_16BIT(&IpcRx->IpcEndAddr));
for (uint8_t i = 0; i < IpcData->DataLen; i++)
{
IpcData->p_data[i] = HR_IPC_REG_8BIT(Rptr);
RB_UPDATE_PTR(Rptr, HR_REG_16BIT(&IpcRx->IpcStartAddr), HR_REG_16BIT(&IpcRx->IpcEndAddr));
}
HW_REG_16BIT(&IpcRx->ReadPtr, (uint32_t)Rptr);
#ifdef IPC_DEBUG
PrintHCIPack(IpcData,"rx");
#endif
return TRUE;
}
else
{
return FALSE;
}
}
Boolean IPC_GetBtData(void *buf, uint32_t *size)
{
uint32_t i = 0;
uint16_t Rptr = HR_REG_16BIT(&IpcRx->ReadPtr);
if (*size == 0)
{
*size = 0;
return FALSE;
}
if (TRUE == IPC_have_data())
{
while (Rptr != HR_REG_16BIT(&IpcRx->WrtiePtr) && i < (*size))
{
((uint8_t *)buf)[i++] = HR_IPC_REG_8BIT(Rptr);
RB_UPDATE_PTR(Rptr, HR_REG_16BIT(&IpcRx->IpcStartAddr), HR_REG_16BIT(&IpcRx->IpcEndAddr));
}
HW_REG_16BIT(&IpcRx->ReadPtr, (uint32_t)Rptr);
*size = i;
return TRUE;
}
else
{
*size = 0;
return FALSE;
}
}
static void noinline _dma_start(int ch, const void *src, int srclen, void *dest, int dstlen)
{
DMA_SRC_ADDR(ch) = (int)src;
DMA_DEST_ADDR(ch) = (int)dest;
DMA_LEN(ch) = srclen << 16 | dstlen;
DMA_START(ch) = 0x80;
}
void noinline _dma_wait(int ch)
{
while (!(DMA_STATUS(ch) & 1));
}
void _dmacopy(void *dest, void *src, int len)
{
_dma_start(DMACH_MEMCP, src, len, dest, len);
_dma_wait(DMACH_MEMCP);
}
void _download_btcode(const byte *btcode)
{
int addr, len;
btcode += 2;
if (GETWORD(btcode) != 0x55aa)
return;
btcode += 2;
enable_clock(CLKCLS_BT);
len = GETWORD(btcode);
btcode += 2;
BT_UCODE_LO = 0;
BT_UCODE_HI = 0;
BT_UCODE_CTRL = 0x80;
DMA_CONFIG(DMACH_MEMCP) = 8;
_dmacopy((byte *)&BT_UCODE_DATA, (byte *)btcode, len);
BT_UCODE_CTRL = 0;
btcode += len;
DMA_CONFIG(DMACH_MEMCP) = 0;
while (GETWORD(btcode) == 0x55aa)
{
btcode += 2;
len = GETWORD(btcode);
btcode += 2;
addr = GETWORD(btcode) | 0xc0000;
btcode += 2;
if(addr==MEM_SPP_FLOWCTRL_FLAG_ADDR && len==0x0004)
{
byte mem_spp_flowctrl_buf[4];
mem_spp_flowctrl_buf[0]=MEM_SPP_FLOWCTRL_FLAG_VALUE;
memcpy((byte*)&mem_spp_flowctrl_buf[1],btcode+1,3);
_dmacopy((byte *)addr, mem_spp_flowctrl_buf, len);
}
else if(addr==MEM_RFCOMM_LMP_DIS_FLAG_ADDR && len==0x0001)
{
byte mem_rfcomm_lmp_dis_flag;
mem_rfcomm_lmp_dis_flag=MEM_RFCOMM_LMP_DIS_FLAG_VALUE;
_dmacopy((byte *)addr, (byte *)&mem_rfcomm_lmp_dis_flag, len);
}
else
{
_dmacopy((byte *)addr, (byte *)btcode, len);
}
btcode += len;
}
}
//extern uint8_t BT_Wake;
extern const unsigned char bt_code[];
void erase_memory(void)
{
for (uint32_t i = 0; i < 0x1000; i++)
{
*(volatile uint8_t *)(0xc0000 + i) = 0;
delay_us(1);
*(volatile uint8_t *)(0xc4000 + i) = 0;
delay_us(1);
}
}
#if (VERSIONS == NO_BT)
static uint16_t get_dpll_status(void)
{
uint16_t addr = 0;
addr = (*(uint8_t *)(0xc800e));
delay_us(1100);
addr += (*(uint8_t *)(0xc800f)) << 8;
delay_us(1100);
return addr;
}
static Boolean is_dpll_opend(void)
{
uint16_t addr = get_dpll_status();
Boolean ret = FALSE;
if ((0x4c77 == addr) || (0x4c78 == addr) || (0x4c79 == addr))
{
ret = TRUE;
}
else
{
ret = FALSE;
}
MyPrintf("is_dpll_opend=%x-%x", addr, ret);
return ret;
}
#endif
Boolean ipc_inited = FALSE;
void IpcInit(void)
{
#if (VERSIONS == EXIST_BT)
if (ipc_inited == FALSE)
{
disable_intr(INTR_BT);
ipc_inited = TRUE;
SYSCTRL_ROM_SWITCH = 0x94;
//delay(10000); //wait rom switch ok
delay_ms(10);
BT_RESET = 1;
//delay(10000); //wait for reset ok
delay_ms(1);
while (!(BT_CONFIG & (1 << BT_INIT_FLAG)));
BT_CONFIG &= (~(1 << BT_INIT_FLAG));
lpm_bt_write(1, lpm_bt_read(1)|0xd00000);
lpm_bt_write(0, 0x3084cf0f);
erase_memory();
_download_btcode(bt_code);
WAKEUP_BT = 0x9c;
delay_ms(100);
}
#elif (VERSIONS == NO_BT)
if (ipc_inited == FALSE || is_dpll_opend() == FALSE)
{
disable_intr(INTR_BT);
ipc_inited = TRUE;
SYSCTRL_ROM_SWITCH = 0x94;
//delay(10000); //wait rom switch ok
delay_ms(10);
lpm_bt_write(1, 0xd00000);
//delay_us(1000);
delay_ms(1);
BT_RESET = 1;
//delay(10000); //wait for reset ok
delay_ms(1);
while (!(BT_CONFIG & (1 << BT_INIT_FLAG)));
BT_CONFIG &= (~(1 << BT_INIT_FLAG));
lpm_bt_write(1, 0xd00000);
lpm_bt_write(0, 0x3084cf0f);
erase_memory();
*(volatile uint8_t *)0xC4176 = 0x0f;
*(volatile uint8_t *)0xC4177 = 0x84;
*(volatile uint8_t *)0xC4178 = 0x30;
*(volatile uint8_t *)0xC4179 = 0x0a;
*(volatile uint8_t *)0xC40c3 = 0x00;
*(volatile uint8_t *)0xC40c4 = 0x4f;
*(volatile uint8_t *)0xC4f00 = 0xff;
delay_ms(60);
*(volatile uint8_t *)0xC8042 = 0x06;
}
#elif (VERSIONS == NO_XTAL)
if (ipc_inited == FALSE)
{
disable_intr(INTR_BT);
ipc_inited = TRUE;
SYSCTRL_ROM_SWITCH = 0x94;
delay_ms(10); //wait rom switch ok
lpm_bt_write(1, 0xd00000);
delay_ms(1);
BT_RESET = 1;
delay_ms(1); //wait for reset ok
while (!(BT_CONFIG & (1 << BT_INIT_FLAG)));
BT_CONFIG &= (~(1 << BT_INIT_FLAG));
lpm_bt_write(1, 0xd00000);
lpm_bt_write(0, 0x3084cf0f);
}
#endif
}
//打印HCI数据包
void PrintHCIPack(HCI_TypeDef *msg, const char *str)
{
MyPrintf("M0 %s:\n", str);
MyPrintf("%s Type:%02x\n", str, msg->type);
MyPrintf("%s OPCode: %02x\n", str, msg->opcode);
MyPrintf("%s Length: %02x\n", str, msg->DataLen);
MyPrintf("%s Data:\n", str);
if(msg->DataLen!=0xb8&&msg->DataLen!=0xff)
{
for (uint8_t cnt = 0; cnt < msg->DataLen; cnt++)
{
MyPrintf("%02x ", msg->p_data[cnt]);
if ((cnt % 16) == 0&&cnt!=0)
MyPrintf("\n");
}
}
MyPrintf("\n");
}
// C:\Users\Administrator\Desktop\PT26_Project\Librarier\sdk\yc_sysctrl.c
#include "yc_sysctrl.h"
void SYSCTRL_AHBPeriphClockCmd(uint32_t SYSCTRL_AHBPeriph, FunctionalState NewState)
{
_ASSERT(IS_SYSCTRL_AHB_PERIPH(SYSCTRL_AHBPeriph));
if (NewState == DISABLE)
{
SYSCTRL_CLK_CLS |= SYSCTRL_AHBPeriph;
}
else
{
SYSCTRL_CLK_CLS &= ~SYSCTRL_AHBPeriph;
}
}
void SYSCTRL_EnterSleep(SleepMode_TypeDef SleepMode)
{
_ASSERT(IS_ALL_SLEEP_MODE(SleepMode));
*LPM_SLEEP = 0x5a;
}
void noinline HCLKConfig_Div_None(uint32_t HCLK_Div)
{
QSPI_CTRL |= (0x80);
int temp = (SYSCTRL_HCLK_CON & (~SYSCTRL_HCLK_COFG_REGBIT)) | HCLK_Div;
SYSCTRL_HCLK_CON = temp;
}
void SYSCTRL_HCLKConfig(uint32_t HCLK_Div)
{
_ASSERT(IS_GET_SYSCTRL_HCLK_DIV(HCLK_Div));
__asm("CPSID i");
if (HCLK_Div == SYSCTRL_HCLK_Div_None)
{
uint32_t HCLKConfig_Div_None_addr = (uint32_t)HCLKConfig_Div_None;
((void(*)(void *, void *))FUNC_PREFETCH)(((uint32_t *)HCLKConfig_Div_None_addr), ((uint32_t *)(HCLKConfig_Div_None_addr + 64)));
HCLKConfig_Div_None(HCLK_Div);
}
else
{
int temp = (SYSCTRL_HCLK_CON & (~SYSCTRL_HCLK_COFG_REGBIT)) | HCLK_Div;
SYSCTRL_HCLK_CON = temp;
}
__asm("CPSIE i");
}
void SYSCTRL_GetClocksFreq(SYSCTRL_ClocksTypeDef *SYSCTRL_Clocks)
{
SYSCTRL_Clocks->HCLK_Frequency = CPU_MHZ;
}
void SYSCTRL_EnableDpllClk(void)
{
enable_clock(CLKCLS_BT);
SYSCTRL_ROM_SWITCH = 0x94;
delay(500);
*(volatile byte *)0xc4ab1 = 0x7f;
*(volatile byte *)0xc4ab2 = 0xff;
*(volatile byte *)0xc4ab3 = 0xff;
*(volatile byte *)0xc40c3 = 0xb1;
*(volatile byte *)0xc40c4 = 0x4a;
BT_CLKPLL_EN = 0xff;
}
// G:\Git_file\YC3121_PT26\Librarier\sdk\yc_bt.c
#include "yc_bt.h"
#include "yc_systick.h"
#include "yc_timer.h"
#include "yc_ipc.h"
#define BT_LOG 0
#define BT_ERROR_LOG
static tick StartTick;
static uint32_t HCI_CMD_BIT_FLAG[2] = {0};
#define BTTIMEOUT 500
//#define BT_BUFSIZE 2048
#define BT_BUFSIZE 0x1000
uint8_t rcvbuf[BT_BUFSIZE] = {0};
extern uint8_t ipcrecbuf[IPCREVSIZE];
//static BT_BufTypeDef BluetoothBuf;
BT_BufTypeDef BluetoothBuf;
static uint8_t CmdRepData[5];
static int PacketNum = 0;
extern IPC_TypeDef *IpcTx;
extern IPC_TypeDef *IpcRx;
extern uint8_t bt_lpm_mode;
HCI_TypeDef hci_bt;
void BT_BIT_SET(uint32_t *a, int b)
{
if (b < 32)
{
a[0] |= (1 << b);
}
else
{
a[1] |= (1 << (b - 32));
}
}
void BT_BIT_CLEAR(uint32_t *a, int b)
{
if (b < 32)
{
a[0] &= ~(1 << b);
}
else
{
a[1] &= ~(1 << (b - 32));
}
}
Boolean BT_BIT_GET(uint32_t *a, int b)
{
if (b < 32)
{
return (Boolean)((a[0] & (1 << b)) >> b);
}
else
{
return (Boolean)((a[1] & (1 << (b - 32))) >> (b - 32));
}
}
static void SkipData(int Num)
{
BluetoothBuf.ReadIndex += Num;
if (BluetoothBuf.ReadIndex >= BluetoothBuf.BufSize) BluetoothBuf.ReadIndex -= BluetoothBuf.BufSize;
NVIC_DisableIRQ(BT_IRQn);
BluetoothBuf.count -= Num;
NVIC_EnableIRQ(BT_IRQn);
}
static void SaveData(uint8_t *data, int len)
{
int i;
if (BluetoothBuf.count + len > BluetoothBuf.BufSize)
{
#ifdef BT_ERROR_LOG
MyPrintf("BluetoothBuf full\r\n");
#endif
return;
}
for (i = 0; i < len; i++)
{
BluetoothBuf.pBuf[BluetoothBuf.WriteIndex] = data[i];
BluetoothBuf.count++;
BluetoothBuf.WriteIndex++;
if (BluetoothBuf.WriteIndex >= BluetoothBuf.BufSize) BluetoothBuf.WriteIndex = 0;
}
}
//#define PrintLog
#define DOMAIN_MAX_LEN 62
Boolean BNEP_DomainConvert(unsigned char *domainString, unsigned char domainStringLen, unsigned char *newDomainString, int *newDomainStringIndex)
{
#ifdef PrintLog
MyPrintf("input domain:%s \n", domainString);
#endif
unsigned char domainCount = 0;
*newDomainStringIndex = 1;
int newDomainDelimiterIndex = 0;
#ifdef PrintLog
MyPrintf("domain hex:\n");
for (int i = 0; i < domainStringLen; i++)
{
MyPrintf("%02X ", domainString[i]);
}
MyPrintf("\n");
#endif
while (domainStringLen--)
{
domainCount++;
if (*domainString == '.')
{
newDomainString[newDomainDelimiterIndex] = domainCount - 1;
newDomainDelimiterIndex = *newDomainStringIndex;
(*newDomainStringIndex)++;
if ((*newDomainStringIndex) >= DOMAIN_MAX_LEN) return FALSE;
domainCount = 0;
}
else
{
newDomainString[(*newDomainStringIndex)++] = *domainString;
if ((*newDomainStringIndex) >= DOMAIN_MAX_LEN) return FALSE;
}
domainString++;
}
newDomainString[newDomainDelimiterIndex] = domainCount;
newDomainString[(*newDomainStringIndex)++] = 00;
if ((*newDomainStringIndex) >= DOMAIN_MAX_LEN) return FALSE;
#ifdef PrintLog
MyPrintf("format Domain:\n");
for (int i = 0; i < *newDomainStringIndex; i++)
{
MyPrintf("%02X ", newDomainString[i]);
}
MyPrintf("\n");
#endif
return TRUE;
}
Boolean BT_Init()
{
BluetoothBuf.BufSize = BT_BUFSIZE;
BluetoothBuf.pBuf = rcvbuf;
BluetoothBuf.count = 0;
BluetoothBuf.ReadIndex = 0;
BluetoothBuf.WriteIndex = 0;
HCI_CMD_BIT_FLAG[0] = 0; //全局变量问题优化
HCI_CMD_BIT_FLAG[1] = 0;
StartTick = 0;
PacketNum = 0;
int i;
for (i = 0; i < 5; i++) CmdRepData[i] = 0;
for (i = 0; i < BT_BUFSIZE; i++) rcvbuf[i] = 0;
hci_bt.p_data = ipcrecbuf;
IpcInit();
#ifdef BT_ERROR_LOG
MyPrintf("BT_Init end\n");
#endif
return TRUE;
}
Boolean BT_WakeupInit()
{
BluetoothBuf.BufSize = BT_BUFSIZE;
BluetoothBuf.pBuf = rcvbuf;
BluetoothBuf.count = 0;
BluetoothBuf.ReadIndex = 0;
BluetoothBuf.WriteIndex = 0;
hci_bt.p_data = ipcrecbuf;
enable_intr(INTR_BT);
bt_lpm_mode = 1;
BT_SetLpmMode(0x00);
#ifdef BT_ERROR_LOG
MyPrintf("BT_Wakeup Init end\n");
#endif
return TRUE;
}
static uint8_t GetData(Boolean UpdataAnalyzeIndex)
{
uint8_t TempData;
TempData = BluetoothBuf.pBuf[BluetoothBuf.ReadIndex];
if (UpdataAnalyzeIndex)
{
NVIC_DisableIRQ(BT_IRQn);
BluetoothBuf.count--;
NVIC_EnableIRQ(BT_IRQn);
BluetoothBuf.ReadIndex++;
if (BluetoothBuf.ReadIndex >= BluetoothBuf.BufSize) BluetoothBuf.ReadIndex = 0;
}
return TempData;
}
static Boolean SendCMD(HCI_TypeDef *msg)
{
if ((msg->DataLen + 3) > IPC_get_available_size())
{
#ifdef BT_ERROR_LOG
MyPrintf("IPC BT Tx FULL\n");
#endif
return FALSE;
}
msg->type = HCI_CMD;
#if BT_LOG
MyPrintf("Print Send Data Pack:\n");
PrintHCIPack(msg, "Send");//打印发送包
#endif
IPC_TxData(msg);
return TRUE;
}
Boolean BT_SetBtAddr(uint8_t *bt_addr)
{
HCI_TypeDef msg;
msg.opcode = HCI_CMD_SET_BT_ADDR;
msg.DataLen = 6;
msg.p_data = bt_addr;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SET_BT_ADDR);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SET_BT_ADDR))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT)); //ms
return FALSE;
}
Boolean BT_SetBleAddr(uint8_t *bt_addr)
{
HCI_TypeDef msg;
msg.opcode = HCI_CMD_SET_BLE_ADDR;
msg.DataLen = 6;
msg.p_data = bt_addr;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SET_BLE_ADDR);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SET_BLE_ADDR))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT)); //ms
return FALSE;
}
Boolean BT_SetVisibility(Boolean bt_discoverable, Boolean bt_connectability, Boolean ble_discoverable)
{
HCI_TypeDef msg;
uint8_t visibility_data = 0;
if (bt_discoverable == 1)
visibility_data = visibility_data | 0x01;
if (bt_connectability == 1)
visibility_data = visibility_data | 0x02;
if (ble_discoverable == 1)
visibility_data = visibility_data | 0x04;
msg.opcode = HCI_CMD_SET_VISIBILITY;
msg.DataLen = 0x01;
msg.p_data = &visibility_data;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SET_VISIBILITY);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SET_VISIBILITY))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
return FALSE;
}
Boolean BT_SetBtName(uint8_t *bt_name, uint16_t name_len)
{
HCI_TypeDef msg;
msg.opcode = HCI_CMD_SET_BT_NAME;
msg.DataLen = name_len;
msg.p_data = bt_name;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SET_BT_NAME);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SET_BT_NAME))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
return FALSE;
}
Boolean BT_SetBleName(uint8_t *ble_name, uint16_t name_len)
{
HCI_TypeDef msg;
msg.opcode = HCI_CMD_SET_BLE_NAME;
msg.DataLen = name_len;
msg.p_data = ble_name;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SET_BLE_NAME);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SET_BLE_NAME))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
return FALSE;
}
Boolean BT_SendSppData(uint8_t *spp_data, uint16_t DataLen)
{
if (DataLen == 0 || DataLen > MAX_BLUETOOTH_DATA_LEN) return FALSE;
HCI_TypeDef msg;
msg.opcode = HCI_CMD_SEND_SPP_DATA;
msg.DataLen = DataLen;
msg.p_data = spp_data;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SEND_SPP_DATA);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SEND_SPP_DATA))
{
//MyPrintf("bt send is successed\n");
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
MyPrintf("bt send is failed\n");
return FALSE;
}
Boolean BT_SendBleData(uint8_t *ble_data, uint16_t DataLen)
{
if (DataLen < 2 || DataLen > MAX_BLUETOOTH_DATA_LEN) return FALSE;
HCI_TypeDef msg;
msg.opcode = HCI_CMD_SEND_BLE_DATA;
msg.DataLen = DataLen;
msg.p_data = ble_data;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SEND_BLE_DATA);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SEND_BLE_DATA))
{
//MyPrintf("send is successed\n");
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
MyPrintf("send is failed\n");
return FALSE;
}
uint8_t Bt_GetBtStatus(void)
{
HCI_TypeDef msg;
msg.opcode = HCI_CMD_STATUS_REQUEST;
msg.DataLen = 0;
msg.p_data = NULL;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_STATUS_REQUEST);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_STATUS_REQUEST))
{
return CmdRepData[0];
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT)); //ms
//
return 0x80;
}
Boolean BT_SetParingMode(uint8_t mode)
{
uint8_t tmode = mode ;
HCI_TypeDef msg;
msg.opcode = HCI_CMD_SET_PAIRING_MODE;
msg.DataLen = 1;
msg.p_data = &tmode;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SET_PAIRING_MODE);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SET_PAIRING_MODE))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
return FALSE;
}
Boolean BT_SetPincode(uint8_t *Pincode, uint8_t DataLen)
{
HCI_TypeDef msg;
msg.opcode = HCI_CMD_SET_PINCODE;
msg.DataLen = DataLen;
msg.p_data = Pincode;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SET_PINCODE);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SET_PINCODE))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
return FALSE;
}
Boolean BT_BtDisconnect(void)
{
HCI_TypeDef msg;
msg.opcode = HCI_CMD_BT_DISCONNECT;
msg.DataLen = 0;
msg.p_data = NULL;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_BT_DISCONNECT);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_BT_DISCONNECT))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
return FALSE;
}
uint32_t BT_GetVersion(void)
{
HCI_TypeDef msg;
uint32_t TempVersion = 0;
msg.opcode = HCI_CMD_VERSION_REQUEST;
msg.DataLen = 0;
msg.p_data = NULL;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_GET_VERSION);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_GET_VERSION))
{
TempVersion = (CmdRepData[0] << 8) | (CmdRepData[1]);
return TempVersion;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
return 0;
}
Boolean BT_BleDisconnect(void)
{
HCI_TypeDef msg;
msg.opcode = HCI_CMD_BLE_DISCONNECT;
msg.DataLen = 0;
msg.p_data = NULL;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_BLE_DISCONNECT);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_BLE_DISCONNECT))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
return FALSE;
}
Boolean BT_SetNVRAM(uint8_t *NvData, int len)
{
HCI_TypeDef msg;
msg.opcode = HCI_CMD_SET_NVRAM;
msg.DataLen = len;
msg.p_data = NvData;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SET_NVRAM);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SET_NVRAM))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
return FALSE;
}
Boolean BT_EnterSleepMode(void)
{
HCI_TypeDef msg;
msg.opcode = HCI_CMD_ENTER_SLEEP_MODE;
msg.DataLen = 0;
msg.p_data = NULL;
SendCMD(&msg);
return TRUE;
}
Boolean BT_SetLpmMode(uint8_t mode)
{
HCI_TypeDef msg;
uint8_t temp_mode = mode;
msg.opcode = HCI_CMD_SET_LPM_MODE;
msg.DataLen = 1;
msg.p_data = &temp_mode;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SET_LPM_MODE);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SET_LPM_MODE))
{
bt_lpm_mode = mode;
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
return FALSE;
}
Boolean BT_ConfirmGkey(uint8_t isMatching)
{
HCI_TypeDef msg;
uint8_t tmismatching = isMatching;
msg.opcode = HCI_CMD_CONFIRM_GKEY;
msg.DataLen = 1;
msg.p_data = &tmismatching;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_CONFIRM_GKEY);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_CONFIRM_GKEY))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
return FALSE;
}
Boolean BT_SetSppFlowcontrol(uint8_t packetNum)
{
HCI_TypeDef msg;
msg.opcode = HCI_CMD_GET_CREADIT_GIVEN;
msg.DataLen = 1;
uint8_t temp_packetNum = packetNum;
msg.p_data = &temp_packetNum;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_GET_CREADIT_GIVEN);
SendCMD(&msg);
return TRUE;//no event responce
}
Boolean BT_PasskeyEntry(uint8_t *key_data)
{
#define PKLEN 0x04
HCI_TypeDef msg;
msg.opcode = HCI_CMD_PASSKEY_ENTRY;
msg.DataLen = PKLEN;
msg.p_data = key_data;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_PASSKEY_ENTRY);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_PASSKEY_ENTRY))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
return FALSE;
}
Boolean BT_SetLEParing(uint8_t mode)
{
HCI_TypeDef msg;
msg.opcode = HCI_CMD_LE_SET_PAIRING;
msg.DataLen = 1;
uint8_t temp_mode = mode;
msg.p_data = &temp_mode;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_LE_SET_PARING);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_LE_SET_PARING))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
return FALSE;
}
Boolean BT_SetLEAdvData(uint8_t *adv_data, int DataLen)
{
HCI_TypeDef msg;
msg.opcode = HCI_CMD_LE_SET_ADV_DATA;
msg.DataLen = DataLen;
msg.p_data = adv_data;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_LE_SET_ADV_DATA);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_LE_SET_ADV_DATA))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
return FALSE;
}
Boolean BT_SetLEScanData(uint8_t *scan_data, int DataLen)
{
HCI_TypeDef msg;
msg.opcode = HCI_CMD_LE_SET_SCAN_DATA;
msg.DataLen = DataLen;
msg.p_data = scan_data;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_LE_SET_SCAN_DATA);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_LE_SET_SCAN_DATA))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
return FALSE;
}
Boolean BT_SetLESendConnUpdate(uint8_t *data, int len)
{
if (0x08 != len)
return FALSE;
HCI_TypeDef msg;
msg.opcode = HCI_CMD_LE_SEND_CONN_UPDATE_REQ;
msg.DataLen = len;
msg.p_data = data;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_LE_SEND_CONN_UPDATE);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_LE_SEND_CONN_UPDATE))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
return FALSE;
}
Boolean BT_SetLEAdvInterval(uint16_t ble_adv_interval)
{
HCI_TypeDef msg;
msg.opcode = HCI_CMD_LE_SET_ADV_PARM;
msg.DataLen = 2;
uint8_t ble_adv_interval_buf[2];
ble_adv_interval_buf[0] = (ble_adv_interval & 0xff);
ble_adv_interval_buf[1] = ((ble_adv_interval >> 8) & 0xff);
msg.p_data = ble_adv_interval_buf;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_LE_SET_ADV_PARM);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_LE_SET_ADV_PARM))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
return FALSE;
}
Boolean BT_RejectJustWork(uint8_t justwork)
{
uint8_t td = justwork;
HCI_TypeDef msg;
msg.opcode = HCI_CMD_REJECT_JUSTWORK;
msg.DataLen = 0x01;
msg.p_data = &td;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_REJECT_JUSTWORK);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_REJECT_JUSTWORK))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
return FALSE;
}
Boolean BT_SetTxPower(uint8_t power)
{
uint8_t tpower = power;
HCI_TypeDef msg;
msg.opcode = HCI_CMD_SET_TX_POWER;
msg.DataLen = 0x01;
msg.p_data = &tpower;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SET_TXPOWER);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SET_TXPOWER))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
return FALSE;
}
Boolean BT_Set_FixedPasskey(uint8_t *key)
{
HCI_TypeDef msg;
msg.opcode = HCI_CMD_LE_SET_FIXED_PASSKEY;
msg.DataLen = 0x05;
msg.p_data = key;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_LE_SET_FIXED_PASSKEY);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_LE_SET_FIXED_PASSKEY))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
return FALSE;
}
Boolean BT_SetCOD(uint8_t *bt_cod)
{
HCI_TypeDef msg;
msg.opcode = HCI_CMD_SET_COD;
msg.DataLen = 3;
msg.p_data = bt_cod;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SET_COD);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SET_COD))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT)); //ms
return FALSE;
}
Boolean BT_DeleteService(void)
{
HCI_TypeDef msg;
msg.opcode = HCI_CMD_DELETE_CUSTOMIZE_SERVICE;
msg.DataLen = 0;
msg.p_data = NULL;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_DELETE_SERVICE);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_DELETE_SERVICE))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
return FALSE;
}
uint16_t BT_AddBleService(uint8_t *ble_service_uuid, uint16_t service_uuid_len)
{
HCI_TypeDef msg;
msg.opcode = HCI_CMD_ADD_SERVICE_UUID;
msg.DataLen = service_uuid_len;
msg.p_data = ble_service_uuid;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_ADD_UUID);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_ADD_UUID))
{
return (uint16_t)(CmdRepData[0] | (CmdRepData[1] << 8));
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
return 0x00;
}
uint16_t BT_AddBleCharacteristic(uint8_t *ble_Characteristic_uuid, uint16_t service_Characteristic_payload_len)
{
HCI_TypeDef msg;
msg.opcode = HCI_CMD_ADD_CHARACTERISTIC_UUID;
msg.DataLen = service_Characteristic_payload_len;
msg.p_data = ble_Characteristic_uuid;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_ADD_UUID);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_ADD_UUID))
{
return (uint16_t)(CmdRepData[0] | (CmdRepData[1] << 8));
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
return 0x00;
}
Boolean BT_DnsReq(uint8_t *dns_data, int len)
{
uint8_t format_dns[DOMAIN_MAX_LEN];
int format_dns_len;
if (TRUE != BNEP_DomainConvert(dns_data, len, format_dns, &format_dns_len))
{
return FALSE;
}
HCI_TypeDef msg;
msg.opcode = HCI_CMD_DNS_REQ;
msg.DataLen = format_dns_len;
msg.p_data = format_dns;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_DNS_REQ);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_DNS_REQ))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT)); //ms
return FALSE;
}
Boolean BT_ConnectBnep(uint8_t *phone_mac_addr, int len)
{
HCI_TypeDef msg;
msg.opcode = HCI_CMD_CONNECT_BNEP;
msg.DataLen = len;
msg.p_data = phone_mac_addr;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_CONNECT_BNEP);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_CONNECT_BNEP))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT)); //ms
return FALSE;
}
Boolean BT_disconnectBnep()
{
return BT_BtDisconnect();
}
Boolean BT_ConnectTcp(uint8_t *tcp_ip_addr, int len)
{
HCI_TypeDef msg;
msg.opcode = HCI_CMD_CONNECT_TCP;
msg.DataLen = len;
msg.p_data = tcp_ip_addr;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_CONNECT_TCP);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_CONNECT_TCP))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT)); //ms
return FALSE;
}
Boolean BT_BnepSendTcpData(uint8_t *tcpdata, int len)
{
if ((len - 1) > MAX_TCP_DATA_LEN) return FALSE;
HCI_TypeDef msg;
msg.opcode = HCI_CMD_BNEP_SEND_TCP_DATA;
msg.DataLen = len;
msg.p_data = tcpdata;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_DATA);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_DATA))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT)); //ms
return FALSE;
}
#define BIG_DATA_HEAD_LEN 5
Boolean BT_BnepSendTcpBigData(uint8_t *tcpdata, int len)
{
if ((len - 1) > MAX_BIG_DATA_LEN) return FALSE;
HCI_TypeDef msg;
msg.opcode = HCI_CMD_SEND_BIG_DATA;
int sendedLen = 0;
int packetLen;
uint8_t firstPacketData[MAX_BLUETOOTH_DATA_LEN];
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_BIG_DATA_FINISH);
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_BIG_DATA_STATUS);
while (sendedLen < (len - 1))
{
if (sendedLen == 0)
{
packetLen = (len - 1) > (MAX_BLUETOOTH_DATA_LEN - BIG_DATA_HEAD_LEN) ? (MAX_BLUETOOTH_DATA_LEN - BIG_DATA_HEAD_LEN) : (len - 1);
msg.DataLen = packetLen + BIG_DATA_HEAD_LEN;
firstPacketData[0] = tcpdata[0]; //handle
firstPacketData[1] = ((len - 1) & 0xff);
firstPacketData[2] = (((len - 1) >> 8) & 0xff); //big packet len
firstPacketData[3] = 0;
firstPacketData[4] = 0; //reserved
memcpy((uint8_t *)&firstPacketData[5], (uint8_t *)&tcpdata[1], packetLen);
msg.p_data = firstPacketData;
}
else
{
packetLen = ((len - 1) - sendedLen) > MAX_BLUETOOTH_DATA_LEN ? MAX_BLUETOOTH_DATA_LEN : ((len - 1) - sendedLen);
msg.DataLen = packetLen;
msg.p_data = (uint8_t *)&tcpdata[sendedLen + 1];
}
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_BIG_DATA);
SendCMD(&msg);
StartTick = SysTick_GetTick();
while (!BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_BIG_DATA))
{
if (SysTick_IsTimeOut(StartTick, BTTIMEOUT))
{
return FALSE;
}
}
sendedLen += packetLen;
}
//wait big data finish
StartTick = SysTick_GetTick();
while (!BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_BIG_DATA_FINISH))
{
if (SysTick_IsTimeOut(StartTick, BTTIMEOUT))
{
return FALSE;
}
}
//wait big data status
StartTick = SysTick_GetTick();
while (!BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_BIG_DATA_STATUS))
{
if (SysTick_IsTimeOut(StartTick, BTTIMEOUT))
{
return FALSE;
}
}
return TRUE;
}
Boolean BT_BnepSendUdpData(uint8_t *udpdata, int len)
{
if (len < 8 || len > MAX_BLUETOOTH_DATA_LEN) return FALSE;
HCI_TypeDef msg;
msg.opcode = HCI_CMD_SEND_UDP_DATA;
msg.DataLen = len;
msg.p_data = udpdata;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_UDP_DATA);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_UDP_DATA))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT)); //ms
return FALSE;
}
Boolean BT_DisconnectTcp(uint8_t tcp_handle)
{
HCI_TypeDef msg;
msg.opcode = HCI_CMD_DISCONNECT_TCP;
msg.DataLen = 1;
uint8_t temp_tcp_handle = tcp_handle;
msg.p_data = &temp_tcp_handle;
BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_DISCONNECT_TCP);
SendCMD(&msg);
StartTick = SysTick_GetTick();
do
{
if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_DISCONNECT_TCP))
{
return TRUE;
}
}
while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT)); //ms
return FALSE;
}
void BT_ParseBTData()
{
//此判断用于防止接收包buf满
if (BluetoothBuf.BufSize - BluetoothBuf.count < 258)
{
#if 1
// MyPrintf("BluetoothBuf full2");
// MyPrintf("BluetoothBuf.BufSize: %d,BluetoothBuf.count: %d\n", BluetoothBuf.BufSize, BluetoothBuf.count);
#endif
return;
}
if (TRUE == IPC_ReadBtData(&hci_bt)) //The packet header has been receive
{
#if 0
MyPrintf("BluetoothBuf.BufSize: %d,BluetoothBuf.count: %d\n", BluetoothBuf.BufSize, BluetoothBuf.count);
PrintHCIPack(&hci_bt, "Receive");
//MyPrintf("PacketNum: %d\n",PacketNum);
#endif
if (hci_bt.type == HCI_EVENT)
{
StartTick = SysTick_GetTick(); //处理tx被rx阻塞时的timeout
switch (hci_bt.opcode)
{
case HCI_EVENT_SPP_DATA_RECEIVED:
// SaveData((uint8_t *)&hci_bt,hci_bt.DataLen+3);
SaveData((uint8_t *)&hci_bt, 3);
SaveData(hci_bt.p_data, hci_bt.DataLen);
PacketNum++;
//MyPrintf("hci_bt.opcode: %d\n",hci_bt.opcode);
break;
case HCI_EVENT_BLE_DATA_RECEIVED:
// SaveData((uint8_t *)&hci_bt,hci_bt.DataLen+3);
SaveData((uint8_t *)&hci_bt, 3);
SaveData(hci_bt.p_data, hci_bt.DataLen);
PacketNum++;
break;
case HCI_EVENT_BNEP_RECEIVE_TCP_DATA:
// SaveData((uint8_t *)&hci_bt,hci_bt.DataLen+3);
SaveData((uint8_t *)&hci_bt, 3);
SaveData(hci_bt.p_data, hci_bt.DataLen);
PacketNum++;
break;
case HCI_EVENT_BNEP_RECEIVE_UDP_DATA:
// SaveData((uint8_t *)&hci_bt,hci_bt.DataLen+3);
SaveData((uint8_t *)&hci_bt, 3);
SaveData(hci_bt.p_data, hci_bt.DataLen);
PacketNum++;
break;
case HCI_EVENT_BT_CONNECTED:
case HCI_EVENT_BLE_CONNECTED:
case HCI_EVENT_GKEY:
case HCI_EVENT_BT_DISCONNECTED:
case HCI_EVENT_BLE_DISCONNECTED:
case HCI_EVENT_NVRAM_CHANGED:
case HCI_EVENT_GET_PASSKEY:
case HCI_EVENT_PAIRING_COMPLETED:
//case HCI_EVENT_LE_PAIRING_STATE:
case HCI_EVENT_BNEP_CONNECT:
case HCI_EVENT_BNEP_DISCONNECT:
case HCI_EVENT_BNEP_CONNECT_FAIL:
case HCI_EVENT_TCP_CONNECT:
case HCI_EVENT_TCP_DISCONNECT:
case HCI_EVNET_TCP_FAIL:
case HCI_EVENT_TCP_CONNECT_LOG:
case HCI_EVENT_BNEP_CHIP_ERROR:
case HCI_EVENT_DNS_RSP:
case HCI_EVENT_BB_DISCONNECT:
case HCI_EVENT_BT_NAME:
case HCI_EVENT_UDP_INFO:
// SaveData((uint8_t *)&hci_bt,hci_bt.DataLen+3);
SaveData((uint8_t *)&hci_bt, 3);
SaveData(hci_bt.p_data, hci_bt.DataLen);
PacketNum++;
break;
case HCI_EVENT_CMD_COMPLETE:
switch (hci_bt.p_data[0])
{
case HCI_CMD_SET_BT_ADDR:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SET_BT_ADDR);
}
break;
case HCI_CMD_SET_BLE_ADDR:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SET_BLE_ADDR);
}
break;
case HCI_CMD_SET_VISIBILITY:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SET_VISIBILITY);
}
break;
case HCI_CMD_SET_BT_NAME:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SET_BT_NAME);
}
break;
case HCI_CMD_SET_BLE_NAME:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SET_BLE_NAME);
}
break;
case HCI_CMD_SEND_SPP_DATA:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SEND_SPP_DATA);
}
break;
case HCI_CMD_SEND_BLE_DATA:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SEND_BLE_DATA);
}
break;
case HCI_CMD_SET_PAIRING_MODE:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SET_PAIRING_MODE);
}
break;
case HCI_CMD_SET_PINCODE:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SET_PINCODE);
}
break;
case HCI_CMD_VERSION_REQUEST:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_GET_VERSION);
CmdRepData[0] = hci_bt.p_data[2];
CmdRepData[1] = hci_bt.p_data[3];
}
break;
case HCI_CMD_LE_SET_PAIRING:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_LE_SET_PARING);
}
break;
case HCI_CMD_BT_DISCONNECT:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_BT_DISCONNECT);
}
break;
case HCI_CMD_BLE_DISCONNECT:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_BLE_DISCONNECT);
}
break;
case HCI_CMD_SET_NVRAM:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SET_NVRAM);
}
break;
case HCI_CMD_CONFIRM_GKEY:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_CONFIRM_GKEY);
}
break;
case HCI_CMD_SET_LPM_MODE:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SET_LPM_MODE);
}
break;
case HCI_CMD_PASSKEY_ENTRY:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_PASSKEY_ENTRY);
}
break;
case HCI_CMD_LE_SET_ADV_DATA:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_LE_SET_ADV_DATA);
}
break;
case HCI_CMD_LE_SET_SCAN_DATA:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_LE_SET_SCAN_DATA);
}
break;
case HCI_CMD_LE_SEND_CONN_UPDATE_REQ:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_LE_SEND_CONN_UPDATE);
}
break;
case HCI_CMD_LE_SET_ADV_PARM:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_LE_SET_ADV_PARM);
}
break;
case HCI_CMD_SET_TX_POWER:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SET_TXPOWER);
}
break;
case HCI_CMD_REJECT_JUSTWORK:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_REJECT_JUSTWORK);
}
break;
case HCI_CMD_SET_COD:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SET_COD);
}
break;
case HCI_CMD_DELETE_CUSTOMIZE_SERVICE:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_DELETE_SERVICE);
}
break;
case HCI_CMD_LE_SET_FIXED_PASSKEY:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_LE_SET_FIXED_PASSKEY);
}
break;
case HCI_CMD_CONNECT_BNEP:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_CONNECT_BNEP);
}
break;
case HCI_CMD_CONNECT_TCP:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_CONNECT_TCP);
}
break;
case HCI_CMD_DISCONNECT_TCP:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_DISCONNECT_TCP);
}
break;
case HCI_CMD_BNEP_SEND_TCP_DATA:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_DATA);
}
break;
case HCI_CMD_SEND_UDP_DATA:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_UDP_DATA);
}
break;
case HCI_CMD_SEND_BIG_DATA:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_BIG_DATA);
}
break;
case HCI_CMD_DNS_REQ:
if (!hci_bt.p_data[1])
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_DNS_REQ);
}
break;
default:
#ifdef BT_ERROR_LOG
MyPrintf("bt 06 cmd err\n");
#endif
break;
}
break;
case HCI_EVENT_I_AM_READY:
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_MODULE_READY);
break;
case HCI_EVENT_STAUS_RESPONSE:
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_STATUS_REQUEST);
CmdRepData[0] = hci_bt.p_data[0];
break;
case HCI_EVENT_UUID_HANDLE:
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_ADD_UUID);
CmdRepData[0] = hci_bt.p_data[0];
CmdRepData[1] = hci_bt.p_data[1];
break;
case HCI_EVENT_BIG_DATA_FINISH:
if (hci_bt.p_data[0] == 0x00)
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_BIG_DATA_FINISH);
}
break;
case HCI_EVENT_BIG_DATA_STATUS:
if (hci_bt.p_data[0] == 0x03 || hci_bt.p_data[0] == 0x04)
{
BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_BIG_DATA_STATUS);
}
break;
default:
#ifdef BT_ERROR_LOG
MyPrintf("bt event err");
#endif
break;
}
IPC_HOLD_BT = 0;
WAKEUP_BT &= ~(1 << WAKEUP_BT_FLAG);
}
else
{
#ifdef BT_ERROR_LOG
MyPrintf("bt 02 err");
#endif
}
}
else
{
#ifdef BT_ERROR_LOG
MyPrintf("receive bt data err");
#endif
}
}
int BT_GetEventOpcode()
{
if (PacketNum <= 0) return -1;
uint8_t TempOpcode;
int TempIndex = BluetoothBuf.ReadIndex + 1;
if (TempIndex == BluetoothBuf.BufSize) TempIndex = 0;
TempOpcode = BluetoothBuf.pBuf[TempIndex];
/*这几个事件用户不用取数据,所以跳过数据包,维护读指针,
其他需要用户获取数据的事件则在BT_ReadBTData中维护指针*/
if (TempOpcode == BT_CONNECTED || \
TempOpcode == BLE_CONNECTED || \
TempOpcode == BT_DISCONNECTED || \
TempOpcode == BLE_DISCONNECTED || \
TempOpcode == BNEP_CONNECT || \
TempOpcode == BNEP_DISCONNECT || \
TempOpcode == BNEP_CHIP_ERROR || \
TempOpcode == HCI_EVENT_BB_DISCONNECT || \
TempOpcode == PASSKEY)
{
SkipData(3);
}
NVIC_DisableIRQ(BT_IRQn);
//MyPrintf("PacketNum11: %d\n",PacketNum);
PacketNum--;
NVIC_EnableIRQ(BT_IRQn);
return TempOpcode;
}
int BT_ReadBTData(uint8_t *pbuf)
{
uint8_t OpCode;
int len = 0;
int i = 0;
if (BluetoothBuf.count < 3) return 0;
SkipData(1);
OpCode = GetData(TRUE);
len = GetData(TRUE);
if (OpCode == BLE_DATA)
{
len-=2;//ble handle 处理
SkipData(2);
}
for (i = 0; i < len; i++)
{
pbuf[i] = GetData(TRUE);
}
return len;
}
// G:\Git_file\YC3121_PT26\Librarier\sdk\yc_bt.h
/**
******************************************************************************
* @file yc_bt.h
* @author Yichip
* @version V1.1
* @date 28-May-2020
* @brief Yichip bluetooth encapsulation.The HCI protocol refers to YC Dual mode module spec-v4.15
*
******************************************************************************
*/
#ifndef __YC_BT_H__
#define __YC_BT_H__
#include "yc_uart.h"
#include "yc_ipc.h"
#define HCI_CMD 0x01
#define HCI_EVENT 0x02
#define MAX_BLUETOOTH_DATA_LEN 255
#define MAX_TCP_DATA_LEN 235
#define MAX_BIG_DATA_LEN 1360
/*BIT judge*/
#define BIT_SET_BT_ADDR 0
#define BIT_SET_BLE_ADDR 1
#define BIT_SET_VISIBILITY 2
#define BIT_SET_BT_NAME 3
#define BIT_SET_BLE_NAME 4
#define BIT_SEND_SPP_DATA 5
#define BIT_SEND_BLE_DATA 6
#define BIT_STATUS_REQUEST 7
#define BIT_SET_PAIRING_MODE 8
#define BIT_SET_PINCODE 9
#define BIT_GET_VERSION 10
#define BIT_BT_DISCONNECT 11
#define BIT_BLE_DISCONNECT 12
#define BIT_SET_NVRAM 13
#define BIT_SET_TXPOWER 14
#define BIT_ENTER_SLEEP_MODE 15
#define BIT_CONFIRM_GKEY 16
#define BIT_POWER_SET 17
#define BIT_GET_CREADIT_GIVEN 18
#define BIT_PASSKEY_ENTRY 19
#define BIT_LE_SET_PARING 20
#define BIT_LE_SET_ADV_DATA 21
#define BIT_LE_SET_SCAN_DATA 22
#define BIT_LE_SEND_CONN_UPDATE 23
#define BIT_LE_SET_ADV_PARM 24
#define BIT_REJECT_JUSTWORK 25
#define BIT_LE_SET_FIXED_PASSKEY 26
#define BIT_SET_PSCAN_INTERVAL 27
#define BIT_MODULE_READY 28
#define BIT_SET_COD 29
#define BIT_SET_CREDIT 30
#define BIT_DELETE_SERVICE 31
#define BIT_ADD_UUID 32
#define BIT_DNS_REQ 33
#define BIT_CONNECT_BNEP 34
#define BIT_CONNECT_TCP 35
#define BIT_BNEP_SEND_TCP_DATA 36
#define BIT_DISCONNECT_TCP 37
#define BIT_BNEP_SEND_UDP_DATA 38
#define BIT_BNEP_SEND_TCP_BIG_DATA 39
#define BIT_BNEP_SEND_TCP_BIG_DATA_FINISH 40
#define BIT_BNEP_SEND_TCP_BIG_DATA_STATUS 41
#define BIT_SET_LPM_MODE 42
/*CMD*/
#define HCI_CMD_SET_BT_ADDR 0x00 //设置 BT3.0 地址
#define HCI_CMD_SET_BLE_ADDR 0x01 //设置 BLE 地址
#define HCI_CMD_SET_VISIBILITY 0x02 //设置可发现和广播
#define HCI_CMD_SET_BT_NAME 0x03 //设置 BT3.0 名称
#define HCI_CMD_SET_BLE_NAME 0x04 //设置 BLE 名称
#define HCI_CMD_SEND_SPP_DATA 0x05 //发送 BT3.0(SPP)数据
#define HCI_CMD_SEND_BLE_DATA 0x09 //发送 BLE 数据
#define HCI_CMD_STATUS_REQUEST 0x0B //请求蓝牙状态
#define HCI_CMD_SET_PAIRING_MODE 0x0C //设置配对模式
#define HCI_CMD_SET_PINCODE 0x0D //设置配对码
#define HCI_CMD_VERSION_REQUEST 0x10 //查询模块固件版本
#define HCI_CMD_BT_DISCONNECT 0x11 //断开 BT3.0 连接
#define HCI_CMD_BLE_DISCONNECT 0x12 //断开 BLE 连接
#define HCI_CMD_SET_NVRAM 0x26 //下发 NV 数据
#define HCI_CMD_ENTER_SLEEP_MODE 0x27 //进入睡眠模式
#define HCI_CMD_CONFIRM_GKEY 0x28 //Numeric Comparison 配对方式中对密钥的比较(见HCI_EVENT_GKEY注释)
#define HCI_CMD_GET_CREADIT_GIVEN 0x29
#define HCI_CMD_PASSKEY_ENTRY 0x30 //passkey配对方式中对密钥的比较
#define HCI_CMD_LE_SET_PAIRING 0x33
#define HCI_CMD_LE_SET_ADV_DATA 0x34
#define HCI_CMD_LE_SET_SCAN_DATA 0x35
#define HCI_CMD_LE_SEND_CONN_UPDATE_REQ 0x36
#define HCI_CMD_LE_SET_ADV_PARM 0x37
#define HCI_CMD_SET_TX_POWER 0x42
#define HCI_CMD_REJECT_JUSTWORK 0x49
#define HCI_CMD_LE_SET_FIXED_PASSKEY 0x61
#define HCI_CMD_DELETE_CUSTOMIZE_SERVICE 0x76
#define HCI_CMD_ADD_SERVICE_UUID 0x77
#define HCI_CMD_ADD_CHARACTERISTIC_UUID 0x78
#define HCI_CMD_SET_COD 0x15 //设置 COD
#define HCI_CMD_CONNECT_BNEP 0x7e //建立BNEP连接
#define HCI_CMD_CONNECT_TCP 0x7f //建立TCP连接
#define HCI_CMD_DISCONNECT_TCP 0x80 //断开TCP连接
#define HCI_CMD_BNEP_SEND_TCP_DATA 0x81 //发送TCP数据
#define HCI_CMD_DNS_REQ 0x82 //域名解析指令
#define HCI_CMD_SEND_UDP_DATA 0x84 //发送UDP数据
#define HCI_CMD_SEND_BIG_DATA 0x85 //发送TCP大包数据
#define HCI_CMD_SET_LPM_MODE 0xff //开关低功耗
/*EVENT*/
#define HCI_EVENT_BT_CONNECTED 0x00 /**BT3.0 连接建立*/
#define HCI_EVENT_BLE_CONNECTED 0x02 /**BLE 连接建立*/
#define HCI_EVENT_BT_DISCONNECTED 0x03 /**BT3.0 连接断开*/
#define HCI_EVENT_BLE_DISCONNECTED 0x05 /**BLE 连接断开*/
#define HCI_EVENT_CMD_COMPLETE 0x06 /**命令已完成*/
#define HCI_EVENT_SPP_DATA_RECEIVED 0x07 /**接收到 BT3.0 数据(SPP)*/
#define HCI_EVENT_BLE_DATA_RECEIVED 0x08 /**接收到 BLE 数据*/
#define HCI_EVENT_I_AM_READY 0x09 /**模块准备好*/
#define HCI_EVENT_STAUS_RESPONSE 0x0A /**状态回复*/
#define HCI_EVENT_NVRAM_CHANGED 0x0D /**上传 NVRAM 数据*/
#define HCI_EVENT_GKEY 0x0E /**HCI 包格式错误*/
#define HCI_EVENT_UART_EXCEPTION 0x0F /*cmd format error*/
#define HCI_EVENT_GET_PASSKEY 0x10 /**PASSKEY 配对方式中通知MCU 返回密钥,MCU收到此事件后需发送HCI_CMD_PASSKEY_ENTRY指令回复蓝牙模块*/
#define HCI_EVENT_PAIRING_COMPLETED 0x11 /**配对完成的事件,通知 MCU配对完成*/
#define HCI_EVENT_LE_PAIRING_STATE 0x14 /**上报配对状态*/
#define HCI_EVENT_UUID_HANDLE 0x29
#define HCI_EVENT_BNEP_CONNECT 0x2c /**通知MCU BNEP连接成功*/
#define HCI_EVENT_BNEP_DISCONNECT 0x2d /**通知MCU BNEP断开连接*/
#define HCI_EVENT_BNEP_CONNECT_FAIL 0x2e /**通知MCU BNEP连接失败原因*/
#define HCI_EVENT_TCP_CONNECT 0x2f /**通知MCU TCP连接成功*/
#define HCI_EVENT_TCP_DISCONNECT 0x30 /**通知MCU TCP断开连接*/
#define HCI_EVENT_BNEP_RECEIVE_TCP_DATA 0x31 /*接收到TCP数据*/
#define HCI_EVNET_TCP_FAIL 0x32 /*TCP连接或者断开失败*/
#define HCI_EVENT_TCP_CONNECT_LOG 0x33 /*TCP连接LOG*/
#define HCI_EVENT_BNEP_CHIP_ERROR 0x34 /*芯片不支持BNEP*/
#define HCI_EVENT_DNS_RSP 0x35 /*DNS返回的ip地址*/
#define HCI_EVENT_BB_DISCONNECT 0x36 /*经典蓝牙baseband断开后返回的事件*/
#define HCI_EVENT_BT_NAME 0x37 /*BT master name*/
#define HCI_EVENT_UDP_INFO 0x38 /*UDP信息头,包含远端IP、本地IP、远端端口、本地端口,后面会紧随一包UDP数据*/
#define HCI_EVENT_BNEP_RECEIVE_UDP_DATA 0x39 /*接收到UDP数据*/
#define HCI_EVENT_BIG_DATA_FINISH 0x3a /*大数据分包发送完成事件*/
#define HCI_EVENT_BIG_DATA_STATUS 0x3b /*大数据分包发送状态*/
/**
* @brief event code enum definition
*/
typedef enum
{
BT_CONNECTED =HCI_EVENT_BT_CONNECTED,
BLE_CONNECTED =HCI_EVENT_BLE_CONNECTED,
BT_DISCONNECTED =HCI_EVENT_BT_DISCONNECTED,
BLE_DISCONNECTED =HCI_EVENT_BLE_DISCONNECTED,
BT_DATA =HCI_EVENT_SPP_DATA_RECEIVED,
BLE_DATA =HCI_EVENT_BLE_DATA_RECEIVED,
NVRAM_DATA =HCI_EVENT_NVRAM_CHANGED,
CONFIRM_GKEY =HCI_EVENT_GKEY,
PASSKEY =HCI_EVENT_GET_PASSKEY,
PAIRING_COMPLETED =HCI_EVENT_PAIRING_COMPLETED,
PAIRING_STATE =HCI_EVENT_LE_PAIRING_STATE,
BNEP_CONNECT =HCI_EVENT_BNEP_CONNECT,
TCP_CONNECT =HCI_EVENT_TCP_CONNECT,
BNEP_RECEIVE_TCP_DATA =HCI_EVENT_BNEP_RECEIVE_TCP_DATA,
TCP_DISCONNECT =HCI_EVENT_TCP_DISCONNECT,
BNEP_DISCONNECT =HCI_EVENT_BNEP_DISCONNECT,
BNEP_CONNECT_FAIL =HCI_EVENT_BNEP_CONNECT_FAIL,
TCP_FAIL =HCI_EVNET_TCP_FAIL,
TCP_CONNECT_LOG =HCI_EVENT_TCP_CONNECT_LOG,
BNEP_CHIP_ERROR =HCI_EVENT_BNEP_CHIP_ERROR,
DNS_RSP =HCI_EVENT_DNS_RSP,
BB_DISCONNECT =HCI_EVENT_BB_DISCONNECT,
BT_NAME =HCI_EVENT_BT_NAME,
UDP_INFO =HCI_EVENT_UDP_INFO,
BNEP_RECEIVE_UDP_DATA =HCI_EVENT_BNEP_RECEIVE_UDP_DATA
}BT_EventCodeEnum;
typedef struct
{
uint8_t* pBuf;
int BufSize;
int count; /*!< count of valid data */
int ReadIndex;
int WriteIndex;
} BT_BufTypeDef;
extern BT_BufTypeDef BluetoothBuf;
/**
* @brief Set the address of the bluetooth 3.0 device
* @param bt_addr: pointer to address(6 bytes)
* @retval TRUE:set addr success.
* FALSE:set addr failed
*/
Boolean BT_SetBtAddr(uint8_t * bt_addr);
/**
* @brief Set the address of the bluetooth 4.0 device
* @param bt_addr: pointer to address(6 bytes)
* @retval TRUE:set addr success.
* FALSE:set addr failed
*/
Boolean BT_SetBleAddr(uint8_t * bt_addr);
/**
* @brief Set the name of the bluetooth 3.0 device
* @param bt_addr: pointer to address information.
* name_len: name length,not include '\0'
* @retval TRUE:set name success.
* FALSE:set name failed
*/
Boolean BT_SetBtName(uint8_t * bt_name, uint16_t name_len);
/**
* @brief Set the name of the bluetooth 4.0 device
* @param ble_name: pointer to name information.
* name_len: name length,not include '\0'
* @retval TRUE:set name success.
* FALSE:set name failed
*/
Boolean BT_SetBleName(uint8_t* ble_name, uint16_t name_len);
/**
* @brief Set visibility mode.
* @param bt_discoverable: 0--bt_discoverable OFF;1--bt_discoverable ON.
* bt_connectability:0--bt_connectability OFF;1--bt_connectability ON.
* ble_discoverable:0--ble_discoverable OFF;1--ble_discoverable ON.
* @retval TRUE:set visibility success.
* FALSE:set visibility failed
*/
Boolean BT_SetVisibility(Boolean bt_discoverable, Boolean bt_connectability, Boolean ble_discoverable);
/**
* @brief Bt send spp(bt3.0) data
* @param spp_data: pointer to spp data
* len: spp data length(max len is 255)
* @retval TRUE:send spp data success.
* FALSE:send spp data failed
*/
Boolean BT_SendSppData(uint8_t * spp_data, uint16_t len);
/**
* @brief Send ble data
* @param ble_data: pointer to ble data ,includes two bytes handle(byte0-byte1 is ble handle).
* len: data length(max len is 255)
* @retval TRUE:send ble data success.
* FALSE:send ble data failed
*/
Boolean BT_SendBleData(uint8_t * ble_data, uint16_t len);
/**
* @brief get bluetooth connect status
* @param None
* @retval bit0:BT 3.0 Can be discover
* bit1:BT 3.0 Can be connected
* bit2:BT 4.0 Can be discover and connected
* bit4:BT 3.0 connected
* bit5:BT 4.0 connected
* bit7:get status timer out
*/
uint8_t Bt_GetBtStatus(void);
/**
* @brief set classic bluetooth paring mode
* @param mode:the paramater can be one of the following value
0x00:pincode
0x01:just work
0x02:passkey
0x03:confirm
* @retval ture or FALSE
*/
Boolean BT_SetParingMode(uint8_t mode);
/**
* @brief set classic bluetooth paring PIN code
* @param Pincode:the pointer ponint to pincode data
len: normally the value can be 0x01~0x10,
* @retval ture or FALSE
*/
Boolean BT_SetPincode(uint8_t* Pincode,uint8_t len);
/**
* @brief get the bluetooth module firmware version number
* @param none
* @retval firmware version number(the value is 1~65535),0 is fail
*
*/
uint32_t BT_GetVersion(void);
/**
* @brief bt disconnect
* @param none
* @retval TRUE:bt disconnected success.
* FALSE:bt disconnected failed
*/
Boolean BT_BtDisconnect(void);
/**
* @brief Set NVRAM
* @param NvData:the pointer point to NVRAMData
* len:bnep is 34(one group),other is 170(5*34=170 five group).
* @retval TRUE:bt disconnected success.
* FALSE:bt disconnected failed
*/
Boolean BT_SetNVRAM(uint8_t * NvData,int len);
/**
* @brief Bt Enter Sleep mode(enter_hibernate)
* @param none
* @retval TRUE:enter sleep mode success
*
*/
Boolean BT_EnterSleepMode(void);
/**
* @brief Bt set LPM mode
* @param mode:0x00-close LPM mode; 0x01-open LPM mode
* @retval TRUE or FALSE
*
*/
Boolean BT_SetLpmMode(uint8_t mode);
/**
* @brief Numeric Comparison key matching in paring mode
* @param mismatching:the paramater can be the follwing value
0x00: key match
0x01: key mismatch
* @retval TRUE:set ConfirmGkey success
* FALSE:set ConfirmGkey failed
*/
Boolean BT_ConfirmGkey(uint8_t isMatching);
/**
* @brief set spp flow control
* @param packetNum:the flow control packet number
* @retval TRUE:success
* FALSE:failed
*/
Boolean BT_SetSppFlowcontrol(uint8_t packetNum);
/**
* @brief Comparison of keys in PASSKEY paring
* @param key_data: point to key data,length is 4 bytes,(data in hexadecimal form,
* starting with high bytes;for example ,218372(10) = 0x35504 ->key_data[]={0x00,0x03,0x55,0x04})
* @retval TRUE:set passkey success
* FALSE:set passkey failed
*/
Boolean BT_PasskeyEntry(uint8_t *key_data);
/**
* @brief Set ble paring mode
* @param mode: the paramater can be the follwing value
* 0x00:none
* 0x01:just work
* 0x02:pass key
* 0x81:secure connect just work
* 0x82:secure connect numeric
* 0x83:secure connect pass key
* @retval TRUE:set ble paring success
* FALSE:set ble paring failed
*/
Boolean BT_SetLEParing(uint8_t mode);
/**
* @brief Send ble adv data
* @param adv_data: pointer to adv data.
* DataLen: data length(must be 0x1f)
* @retval TRUE:set ble adv data success.
* FALSE:set ble adv data failed
*/
Boolean BT_SetLEAdvData(uint8_t* adv_data, int DataLen);
/**
* @brief set ble scan data
* @param scan_data: pointer to scan data.
* DataLen: data length(length < 0x20)
* @retval TRUE:set ble scan data success.
* FALSE:set ble scan data failed
*/
Boolean BT_SetLEScanData(uint8_t* scan_data, int DataLen);
/**
* @brief ble send update ble connect parameter data
* @param data:
* byte0-byte1:min connect interval
* byte2-byte3:max connect interval
* byte4-byte5:Slave latency
* byte6-byte7:Connection Supervision Timeout
* len:len must be 8
* @retval TRUE:success.
* FALSE:failed
*/
Boolean BT_SetLESendConnUpdate(uint8_t *data,int len);
/**
* @brief Set ble adv interval
* @param ble_adv_interval: ble adv interval is ble_adv_interval*0.625ms
* @retval TRUE:set ble adv parm success.
* FALSE:set ble adv parm failed
*/
Boolean BT_SetLEAdvInterval(uint16_t ble_adv_interval);
/**
* @brief Set reject just work
* @param justwork:
* 0:turn off reject just work
* 1:turn on reject just work
* @retval TRUE:set ble scan data success.
* FALSE:set ble scan data failed
*/
Boolean BT_RejectJustWork(uint8_t justwork);
/**
* @brief Set fixed passkey
* @param key: pointer to key data ,key length is 5 bytes
* @retval TRUE:set fixed passkey success.
* FALSE:set ble fixed passkey failed
*/
Boolean BT_Set_FixedPasskey(uint8_t* key);
/**
* @brief ble disconnect
* @param none
* @retval TRUE:ble disconnected success.
* FALSE:ble disconnected failed
*/
Boolean BT_BleDisconnect(void);
/**
* @brief Set spp(bt3.0) class of device
* @param bt_cod:cod buf(must be 3 byte)
* @retval TRUE:success.
* FALSE:failed
*/
Boolean BT_SetCOD(uint8_t* bt_cod);
/**
* @brief Set RF tx power
* @param power: 0:0db
* 1:3db
* 2:5db
* 3:-3db
* 4:-5db
* @retval TRUE:set SetTxPower success.
* FALSE:set SetTxPower failed
*/
Boolean BT_SetTxPower(uint8_t power);
/**
* @brief Delete ble custom Service
* @param none
* @retval TRUE:success.
* FALSE:failed
*/
Boolean BT_DeleteService(void);
/**
* @brief add ble custom Service
* @param ble_service_uuid:
* byte0: uuid length(2 or 16)
* byte1-2(16): uuid
* service_uuid_len: sizeof(ble_service_uuid)
* @retval 0:failed
* other:Service handle
*/
uint16_t BT_AddBleService(uint8_t* ble_service_uuid, uint16_t service_uuid_len);
/**
* @brief add ble custom Characteristic
* @param ble_Characteristic_uuid:
* byte0: characterisitic attribute
* bit0 Broadcast
* bit1 Read
* bit2 Write without Response
* bit3 Write
* bit4 Notify
* bit5 Indicate
* bit6 Authentication Signed Write
* bit7 Extended Properties
* byte1: characterisitic uuid length(2 or 16)
* byte2-3(17):characterisitic uuid
* byte4(18): write/read payload length(1--20;default:1)
* byte5(19)-x:write/read payload(default:00)
* service_Characteristic_payload_len: sizeof(ble_Characteristic_uuid)
* @retval 0:failed
* other:Characteristic handle
*/
uint16_t BT_AddBleCharacteristic(uint8_t* ble_Characteristic_uuid, uint16_t service_Characteristic_payload_len);
/**
* @brief Read the received bluetooth data from receive buffer
* @param pbuf:the output buffer,255 bytes is enough
*
* @retval The data length of the readed,0 is fail
*/
int BT_ReadBTData(uint8_t* pbuf);
/**
* @brief get event opcode of bluetooth module
*
* @param none
*
* @retval -1 :no data
* other :event opcode
*/
int BT_GetEventOpcode(void);
/**
* @brief parse bluetooth module data packet according to yichip HCI protocol from ipc buf,you shoud call it at BT_UART IRQHandler function
* @param Unone
*
* @retval none
*/
void BT_ParseBTData(void);
/**
* @brief Handling user events about bluetooth module,This is not an interrupt function,A circular call is required to detect bluetooth data
*
* @param none
*
* @retval none
*/
void BT_Progress(void);
/**
* @brief BT Init
* @param none
* @retval TRUE:success
* FALSE:fail
*/
Boolean BT_Init(void);
/**
* @brief BT_WakeupInit (M0 Sleep,Bt lpm Sleep)
* @param none
* @retval TRUE:success
* FALSE:fail
*/
Boolean BT_WakeupInit(void);
/**
* @brief DNS(domain name resolution)
* @param dns_data: pointer to domain name(www.baidu.com).
DataLen: data length(max 62 bytes)
* @retval TRUE:success
* FALSE:fail
*/
Boolean BT_DnsReq( uint8_t *dns_data,int len);
/**
* @brief Connect Bnep
* @param *phone_mac_addr: pointer to phone_mac_addr.
Byte0~Byte5 The MAC address you want to connect to your phone
Byte6~Byte21 Link key
(phone MAC and Link key from NVRAM event,all zero is connect last pair phone)
len: data length(must be 22 byte)
* @retval TRUE:success
* FALSE:fail
*/
Boolean BT_ConnectBnep( uint8_t *phone_mac_addr,int len);
/**
* @brief disconnect Bnep
* @param none
* @retval TRUE:success
* FALSE:fail
*/
Boolean BT_disconnectBnep(void);
/**
* @brief Connect Tcp
* @param tcp_ip_addr: pointer to tcp_ip_addr.
Byte0 TCP connect handle(0x00 or 0x01)
Byte1~Byte4 IP address(192.168.1.1 is c0 a8 01 01)
Byte5~Byte6 port number(8888 is 22 b8)
len: data length(must be 7 byte)
* @retval TRUE:success
* FALSE:fail
*/
Boolean BT_ConnectTcp( uint8_t *tcp_ip_addr,int len);
/**
* @brief Send TcpData
* @param tcpdata: pointer to tcpdata.
Byte0 TCP handle
Byte1~ByteN The TCP data need to send(max 235 bytes)
len: data length(max value 1+235)
* @retval TRUE:success
* FALSE:fail
*/
Boolean BT_BnepSendTcpData( uint8_t *tcpdata,int len);
/**
* @brief Send Tcp big packet Data
* @param tcpdata: pointer to tcpdata.
Byte0 TCP handle
Byte1~ByteN The TCP data need to send(max 1460 bytes)
len: data length(max value 1+1460)
* @retval TRUE:success
* FALSE:fail
*/
Boolean BT_BnepSendTcpBigData( uint8_t *tcpdata,int len);
/**
* @brief Send UDP Data
* @param tcpdata: pointer to udpdata.
Byte0~Byte3 UDP remote IP(192.168.1.1 is c0 a8 01 01)
Byte4~Byte5 UDP local port(8888 is 22 b8)
Byte6~Byte7 UDP remote port(12345 is 30 39)
Byte8~ByteN The UDP data need to send(max 247 bytes)
len: data length(max value 255)
* @retval TRUE:success
* FALSE:fail
*/
Boolean BT_BnepSendUdpData( uint8_t *udpdata,int len);
/**
* @brief Disconnect Tcp
* @param tcp_handle: the want to disconnect TCP handle(0x00 or 0x01)
* @retval TRUE:success
* FALSE:fail
*/
Boolean BT_DisconnectTcp(uint8_t tcp_handle);
#endif
// C:\Users\Administrator\Desktop\PT26_Project\Source\Interface.h
/*File Name : Interface.h
*CPU : STM32F10XC8(ARM 32-bit Cortex-M3 CPU)
*Description: 打印机与CPU之间的接口头文件
*********************************************************************/
#ifndef _INTERFACE_H_
#define _INTERFACE_H_
#include "PrtConfig.h"
#include "type.h"
//FLASH CS
#define FLASH_CS_SET (GPIO_SetBits(FLASH_SPI_CS_PORT, FLASH_SPI_CS_PIN))
#define FLASH_CS_RESET (GPIO_ResetBits(FLASH_SPI_CS_PORT, FLASH_SPI_CS_PIN))
//KEY
#define GET_WAKE_KEY (GPIO_ReadInputDataBit(KEY_WAKE_PORT, KEY_WAKE_PIN))
#define GET_SET_KEY (GPIO_ReadInputDataBit(KEY_SET_PORT, KEY_SET_PIN))
//charge
#define GET_CHARGE_STATE (GPIO_ReadInputDataBit(PORT_CHARGE_STATE, PIN_CHARGE_STATE))
//#define GET_USB_PLUG (GPIO_ReadInputDataBit(USB_PLUG_IN_PORT, USB_PLUG_IN_PIN))
//CBUSY
#define USBBusy_ON NVIC_DisableIRQ(USB_IRQn)//disable_intr(INTR_USB);
#define USBBusy_OFF NVIC_EnableIRQ(USB_IRQn)
#define USARTBusy_ON //(GPIO_SetBits(GPIOB, GPIO_Pin_5))
#define USARTBusy_OFF //(GPIO_ResetBits(GPIOB, GPIO_Pin_5))
#define Busy_ON PrinterBusy(1)
#define Busy_OFF PrinterBusy(0)
//USB Connect
#define USB_Connect //(GPIO_SetBits(GPIOB, GPIO_Pin_8))
#define USB_Disconnect //(GPIO_ResetBits(GPIOB, GPIO_Pin_8))
//LAT
#define LAT_ON GPIO_ResetBits(TPH_SPI_CS_PORT, TPH_SPI_CS_PIN)
#define LAT_OFF GPIO_SetBits(TPH_SPI_CS_PORT, TPH_SPI_CS_PIN)
#define TPH_EN_ON do{GPIO_SetBits(TPH_MDEN_PORT,TPH_MDEN_PIN) ; GPIO_SetBits(TPH_POWER_EN_PORT,TPH_POWER_EN_PIN);} while(0)
#define TPH_EN_OFF do{GPIO_ResetBits(TPH_MDEN_PORT,TPH_MDEN_PIN) ; GPIO_ResetBits(TPH_POWER_EN_PORT,TPH_POWER_EN_PIN);} while(0)
#define TIME_RAW 7
//Timer
#define Timer_SetCounter(value) TIM_SetPeriod(TIM4,(value*96))
#define Timer_Enable TIM_Cmd(TIM4, ENABLE)
#define Timer_Disable TIM_Cmd(TIM4, DISABLE)
#define Timer_key_SetCounter(value) TIM_SetPeriod(TIM1,(value*96))
#define Timer_key_Enable TIM_Cmd(TIM1, ENABLE)
#define Timer_key_Disable TIM_Cmd(TIM1, DISABLE)
//LF Motor Timer
#define LFTimer_Enable TIM_Cmd(TIM2, ENABLE)
#define LFTimer_Disable TIM_Cmd(TIM2, DISABLE)
#define LFTimer_SetCounter(value) TIM_SetPeriod(TIM2,value*PAPER.print_speed_time_multiple)
//Prt Timer
#define PrtTimer_Enable TIM_Cmd(TIM3, ENABLE)
#define PrtTimer_Disable TIM_Cmd(TIM3, DISABLE)
#define PrtTimer_SetCounter(value) TIM_SetPeriod(TIM3,value*120)
//Lcd Timer
//#define Timer_Lcd_SetCounter(value) TIM_SetPeriod(TIM5,(value*96))
//#define Timer_Lcd_Enable TIM_Cmd(TIM5, ENABLE)
//#define Timer_Lcd_Disable TIM_Cmd(TIM5, DISABLE)
#define Timer_Lcd1_SetCounter(value) TIM_SetPeriod(TIM7,(value*96))
#define Timer_Lcd1_Enable TIM_Cmd(TIM7, ENABLE)
#define Timer_Lcd1_Disable TIM_Cmd(TIM7, DISABLE)
//Interrupt Switch
#define CloseAllInt //(__set_PRIMASK(1))
#define OpenAllInt //(__set_PRIMASK(0))
//SystemReset
#define SystemReset //(NVIC_SystemReset())
//Load WDG
#define IWDG_Reload WDT_ReloadCounter();
//Prt Stb
#define PrtStb123_ON GPIO_SetBits(TPH_STB1_PORT,TPH_STB1_PIN)
#define PrtStb123_OFF GPIO_ResetBits(TPH_STB1_PORT,TPH_STB1_PIN)
#define PrtStb456_ON GPIO_SetBits(TPH_STB2_PORT,TPH_STB2_PIN)
#define PrtStb456_OFF GPIO_ResetBits(TPH_STB2_PORT,TPH_STB2_PIN)
//Cash前箱
#define bCash_ON //(GPIO_SetBits(GPIOA, GPIO_Pin_8))
#define bCash_OFF //(GPIO_ResetBits(GPIOA, GPIO_Pin_8))
//Motor
#define Motor_A1_ON GPIO_SetBits(STEP_MOTOR_A1_PORT, STEP_MOTOR_A1_PIN)
#define Motor_A1_OFF GPIO_ResetBits(STEP_MOTOR_A1_PORT, STEP_MOTOR_A1_PIN)
#define Motor_A2_ON GPIO_SetBits(STEP_MOTOR_A2_PORT, STEP_MOTOR_A2_PIN)
#define Motor_A2_OFF GPIO_ResetBits(STEP_MOTOR_A2_PORT,STEP_MOTOR_A2_PIN)
#define Motor_B1_ON GPIO_SetBits(STEP_MOTOR_B1_PORT,STEP_MOTOR_B1_PIN)
#define Motor_B1_OFF GPIO_ResetBits(STEP_MOTOR_B1_PORT,STEP_MOTOR_B1_PIN)
#define Motor_B2_ON GPIO_SetBits(STEP_MOTOR_B2_PORT,STEP_MOTOR_B2_PIN)
#define Motor_B2_OFF GPIO_ResetBits(STEP_MOTOR_B2_PORT,STEP_MOTOR_B2_PIN)
#define MOTOR_EN_ON GPIO_SetBits(STEP_MOTOR_EN_PORT,STEP_MOTOR_EN_PIN)
#define MOTOR_EN_OFF GPIO_ResetBits(STEP_MOTOR_EN_PORT,STEP_MOTOR_EN_PIN)
#define GET_MOTOR_OUT_BIT GPIO_ReadOutputDataBit(STEP_MOTOR_EN_PORT,STEP_MOTOR_EN_PIN)
//lcd
#define LCD_RST_ON GPIO_ResetBits(LCD_RST_PORT,LCD_RST_PIN)
#define LCD_RST_OFF GPIO_SetBits(LCD_RST_PORT,LCD_RST_PIN)
//#define LCD_POWER_OFF GPIO_SetBits(LCD_PWR_PORT,LCD_PWR_PIN)
//#define LCD_POWER_ON GPIO_ResetBits(LCD_PWR_PORT,LCD_PWR_PIN)
#define Head_En_ON GPIO_SetBits(Head_En_PORT,Head_En_PIN)
#define Head_En_OFF GPIO_ResetBits(Head_En_PORT,Head_En_PIN)
#ifdef USE_LCD_IIC_PORT
#define LCD_I2C_SDA_H GPIO_SetBits(LCD_IIC_SDA_PORT,LCD_IIC_SDA_PIN)
#define LCD_I2C_SDA_L GPIO_ResetBits(LCD_IIC_SDA_PORT,LCD_IIC_SDA_PIN)
#define LCD_I2C_SCL_H GPIO_SetBits(LCD_IIC_CLK_PORT,LCD_IIC_CLK_PIN)
#define LCD_I2C_SCL_L GPIO_ResetBits(LCD_IIC_CLK_PORT,LCD_IIC_CLK_PIN)
#define LCD_CS_H GPIO_SetBits(LCD_CS_PORT,LCD_CS1_PIN)
#define LCD_CS_L GPIO_ResetBits(LCD_CS_PORT,LCD_CS1_PIN)
#else
#define LCD_SDA_H GPIO_SetBits(LCD_SDA_PORT,LCD_SDA_PINT)
#define LCD_SDA_L GPIO_ResetBits(LCD_SDA_PORT,LCD_SDA_PINT)
#define LCD_SCL_H GPIO_SetBits(LCD_CLK_PORT,LCD_CLK_PIN)
#define LCD_SCL_L GPIO_ResetBits(LCD_CLK_PORT,LCD_CLK_PIN)
#define LCD_CS_H GPIO_SetBits(LCD_CS_PORT,LCD_CS1_PIN)
#define LCD_CS_L GPIO_ResetBits(LCD_CS_PORT,LCD_CS1_PIN)
//#define LCD_DC_H GPIO_SetBits(LCD_DC_PORT,LCD_DC_PIN)
//#define LCD_DC_L GPIO_ResetBits(LCD_DC_PORT,LCD_DC_PIN)
#endif
#define on_0 0
#if on_0
#define LED_BULE_off GPIO_SetBits(LCD_CLK_PORT,LCD_CLK_PIN)
#define LED_BULE_on GPIO_ResetBits(LCD_CLK_PORT,LCD_CLK_PIN)
#define LED_RED_off GPIO_SetBits(LCD_SDA_PORT,LCD_SDA_PINT)
#define LED_RED_on GPIO_ResetBits(LCD_SDA_PORT,LCD_SDA_PINT)
#else
#define LED_BULE_on GPIO_SetBits(LCD_CLK_PORT,LCD_CLK_PIN)
#define LED_BULE_off GPIO_ResetBits(LCD_CLK_PORT,LCD_CLK_PIN)
#define LED_RED_on GPIO_SetBits(LCD_SDA_PORT,LCD_SDA_PINT)
#define LED_RED_off GPIO_ResetBits(LCD_SDA_PORT,LCD_SDA_PINT)
#endif
//power
#define SYS_POWER_EN_ON GPIO_SetBits(SYS_POWER_EN_PORT,SYS_POWER_EN_PIN)
#define SYS_POWER_EN_OFF GPIO_ResetBits(SYS_POWER_EN_PORT,SYS_POWER_EN_PIN)
//bm adc sw
#define BM_E0_ON GPIO_SetBits(BM_E0_PORT,BM_E0_PIN)
#define BM_E0_OFF GPIO_ResetBits(BM_E0_PORT,BM_E0_PIN)
#define BM_E1_ON GPIO_SetBits(BM_E1_PORT,BM_E1_PIN)
#define BM_E1_OFF GPIO_ResetBits(BM_E1_PORT,BM_E1_PIN)
#define gap_e3_on GPIO_SetBits(gap_e3_port,gap_e3_pin)
#define gap_e3_off GPIO_ResetBits(gap_e3_port,gap_e3_pin)
#define gap_e2_on GPIO_SetBits(gap_e2_port,gap_e2_pin)
#define gap_e2_off GPIO_ResetBits(gap_e2_port,gap_e2_pin)
//#define BEEP_ON GPIO_SetBits(BEEP_PORT,BEEP_PIN)
//#define BEEP_OFF GPIO_ResetBits(BEEP_PORT,BEEP_PIN)
#if(GB2312 == 1)//2M FLASH
/*
字库存放分为以下6个部分:
1>Part1 : 0000~EDEF 汉字 A1~A9区 24x24
2>Part2: EDF0~18C8F FontB 9x24 (其中EDF0~F80F 为ASCII 0x20~0x7F,其余为代码页)
代码页为:page0~page 5 , page 16~page19, page 255 .
3>Part3: 18C90~8FC0F 汉字 B0~F7区 24x24
4>Part4 : 8FC10~B060F code page 0~code page 32, page 255 12x24
5>Part3: B0610~E780F code page 50~code page 96 12x24
6>Part2: E7810~E858F ASCII 0x20~0x7F 12X24
*/
//#define EXTFLASH_ADDRESS_FONT_EN_16x8 (0x000DF400)
//#define EXTFLASH_ADDRESS_FONT_CN_16x16 (0x000081C0)
//#define EXTFLASH_ADDRESS_FONT_EN_24x12_1 (0x000E2780)
//#define EXTFLASH_ADDRESS_FONT_EN_24x12_2 (0x000E26F0)
//#define EXTFLASH_ADDRESS_FONT_CN_24x24 (0x001C23F0)
#define BaseAddr1_24x24 0x000000//~0x00EDEF
#define BaseAddr_9x24 0x00EDF0//~0x00F80F
#define ExtendedBaseAddr_9x24 0x00F810//~0x018C8F
#define BaseAddr2_24x24 0x018C90//~0x08FC0F
#define ExtendedBaseAddr1_12x24 0x08FC10//~0x0B060F
#define ExtendedBaseAddr2_12x24 0x0B0610//~0x0E780F
#define BaseAddr_12x24 0x0E7810//~0x0E858F
// #define UserParameterBaseAddr 0x0E9000//~0x0E9FFF 4K
#define UserCharAddr_12x24 0x0EA000//~0x149FFF 96*4K
#define UserCharAddr_9x17 0x0EA000//~0x149FFF 96*4K
#define Pty860Addr 0x100000
#define UserCharAddr_24x24 0x14A000//~0x1A9FFF 93*4K
#define NvImageBaseAddr 0x1AA000//~0x1BEFFF 5*16k(每幅图片最大16K)
#define UndefinedAddr 0x1BF000//~0x1FFFFF
#define LogAddr 0x1FF000//~0x1FFFFF
#define ZKBlockSize_12x24 0x1200
#define ZKBlockSize_9x24 0x0D80
#endif
//PC25VF080B 8Mbit SPI Serial Flash op code
#define FLASH_WriteStatusReg 0x01
#define FLASH_ByteProgram 0x02
#define FLASH_ReadData 0x03
#define FLASH_WriteDisable 0x04
#define FLASH_ReadStatusReg 0x05
#define FLASH_WriteEnable 0x06
#define FLASH_FastReadData 0x0B
#define FLASH_4KSectorErase 0x20
#define FLASH_EnWriteSR 0x50
#define FLASH_AAIWordProgram 0xAD
#define FLASH_ChipErase 0xC7
#define FLASH_DeviceID 0xAB
#define DensitySetTimeLevel1 100
#define DensitySetTimeLevel2 200
#define DensitySetTimeLevel3 300
#define DensitySetTimeLevel4 450
#define BAUDRATE9600 9600
#define BAUDRATE19200 19200
#define BAUDRATE38400 38400
#define BAUDRATE57600 57600
#define BAUDRATE115200 115200
#define AD_Value_PE_EXIT 1200
extern u32 iBaudRate;
extern unsigned char Zimotemp[72];
extern unsigned char KeySelfTestPrinting_flag ; //按键打印自检标志_
extern unsigned char Key_Feed_Line_flag; //右键走纸标志_
extern unsigned char No_paper_flag ;
typedef struct
{
uint8_t Previous_shortreleaseKey;
uint8_t Previous_shortrelease_counter;
uint8_t PreviousKeyArray[5]; //上上次按键状态
uint8_t PreviousKey;
uint8_t CurrentKey;
uint8_t ProcessTime;
uint16_t ProcessTime2;
uint16_t ProcessTime3;
uint16_t ProcessTime4; //用于记录按键按下之后计时(目前设置500),计时减到0再回主界面
uint8_t scan_time;
uint8_t power_state;
uint8_t Key_Cancel_No_paper_state; //按键按下时不显示缺纸显示的标志
uint8_t poweron_firsttime;
uint16_t keySelfTestProcessTime;
uint8_t key_counter;
uint16_t Power_Key_Long_Press; //电源键长按标志
uint16_t PowerKeyLongPressTime; //电源键长按时间
uint8_t FCancelWrongOrders; //取消报错标志
}KEY_STRUCT;
extern KEY_STRUCT BOARD_KEY;
extern void Cpu_Init(void);
extern void USART_Configuration(void);
extern void SerialSendByte(unsigned char SendByte);
extern void SerialSendBuff(unsigned char *SendBuff,unsigned int leng);
extern void PrinterSend(unsigned char *SendBuf,unsigned int leng);
extern void LFMotorPhaseSet(unsigned char Phase);
extern void SPI_Send_Byte(u8 out);
extern u8 SPI_Read_Byte(u32 Dst_Addr);
extern void SPI_Write_Byte(u32 Dst_Addr, u8 byte);
extern void SPI_Erase_Sector(u32 Dst_Addr);
extern void SPI_Write_nBytes(u32 Dst_Addr, u8 *Data, int nBytes);
extern void SPI_FastRead_nBytes(u32 Dst_Addr,u8 *Data , int nBytes);
extern void SPI_Read_nBytes(u32 Dst_Addr, u8 *Data, int nBytes);
extern void PrtStbAllStatus(unsigned char Status);
extern void PrinterBusy(unsigned char Status);
extern void SendnBytes_To_Head(unsigned char *pData,unsigned int nByte);
extern void KEY_Main(void);
extern void PWM_Configuration(void);
extern void MusicPlay(void);
extern void SetTphDensitySetTime(void);
extern void SetMotorSpeedTime(void);
extern void test_3(unsigned char mm);
extern void test_2(unsigned char mm);
extern void test_1(void);
extern void charge_enable(void);
extern void charge_disable(void);
void poweroff_set(void);
#endif
/**********************************END*****************************************/
// G:\Git_file\YC3121_PT26\Librarier\core\board_config.h (souce\CmdSet.c)
/*
File Name : board_config.h
Author : Yichip
Version : V1.0
Date : 2020/07/17
Description : board I/O config file.
*/
#ifndef __BOARD_CONFIG_H__
#define __BOARD_CONFIG_H__
#include "yc3121.h"
#include "yc_gpio.h"
#include "yc_spi.h"
#include "yc_adc.h"
#include "yc_chrg.h"
//ADC绠¤剼?嶇?
#define ADC_IO_PORT GPIOC
#define ADC1_IO_PIN GPIO_Pin_6
#define ADC2_IO_PIN GPIO_Pin_7
#define ADC3_IO_PIN GPIO_Pin_8
#define ADC4_IO_PIN GPIO_Pin_9
#define ADC_GAP_PIN ADC1_IO_PIN
#define ADC_BM_PIN ADC2_IO_PIN
#define ADC_TM_PIN ADC3_IO_PIN
#define ADC_BAT_BIN ADC4_IO_PIN
// G:\Git_file\YC3121_PT26\Source\LCD\api_ui_lcd.c
/******************************************************************************
版权所有: 深圳市。。科技有限公司
文件名: api_ui_led.c
作者: wangdy
创建日期: 2021/06/2
描述: led显示控制
其它:
修改历史: //修改历史记录列表,每条修改记录应包含修改日期、修改者及修改内容简述
序号 修改时间 修改人 修改内容
参考样式
******************************************************************************/
/************************************头文件************************************/
//#include "api_ui_process.h"
//#include "printerConfig.h"
#include "bsp_lcd.h"
#include "api_ui_lcd.h"
#include "LcdMenu.h"
/*
#include "api_ui_main.h"
#include "api_ui_macaddr.h"
#include "api_ui_update.h"
#include "api_ui_language_choice.h"
#include "api_ui_selftest_print.h"
#include "api_ui_auto_poweroff.h"
#include "api_ui_firmware_version.h"
#include "api_ui_poweroff_charge.h"
#include "api_ui_factory_setting.h"
#include "api_ui_carriage_open.h"
#include "api_ui_datatrans.h"
#include "api_ui_paper_type.h"
#include "api_ui_auto_calibrate.h"
#include "api_ui_language.h"
#include "yc_systick.h"
#include "api_font_img.h"
#include <stdio.h>
#include <string.h>
#include "api_keyscan.h"
#include "var_global.h"
#include "printerConfig.h"
#include "api_userpara.h"
#include "api_powerctrl.h"
*/
#define UI_LCD
#ifdef UI_LCD
/*************************************宏定义*************************************/
/*************************************变量*************************************/
ST_UI_HANDLE Current_Handle;
UICommonStoreTypeDef UICommonStore = {0}; //存储参数信息
UICommonTypeDef UICommon = //界面通用信息
{
.Last_MenuID = 1, //默认转第一个界面
};
/*************************************函数*************************************/
/*******************************************************************************
* 名称: UI_Menu_ShowChinese_16x16
* 描述: 显示文本 16*16
* 输入参数: 无
* 输出参数: 无
* 其它:
*******************************************************************************/
void UI_Menu_ShowChinese_16x16(uint8_t x,uint8_t y,uint8_t *chinese)
{
uint8_t i = 0;
uint8_t chinese_buf[2]; //汉字数组信息
uint8_t index = x;
uint8_t *font_ptr; //汉字指针
for(i=0; i<strlen((char *)chinese)/2; i++)
{
//取到汉字字模的位置
chinese_buf[0] = chinese[i*2 + 0];
chinese_buf[1] = chinese[i*2 + 1];
//取到字模信息
font_ptr = Get_FontChinese_16x16(chinese_buf);
//LCD显示
if(font_ptr != NULL)
{
LCD_Display_Chinese_16x16(index,y,font_ptr);
index += 16;
}
}
}
/*******************************************************************************
* 名称: UI_Menu_ShowAscii_16x16
* 描述: 显示ascii 8*16
* 输入参数: 无
* 输出参数: 无
* 其它:
*******************************************************************************/
void UI_Menu_ShowAscii_16x16(uint8_t x,uint8_t y,uint8_t *ascii)
{
uint8_t i = 0;
uint8_t ascii_index = 0; //汉字数组信息
uint8_t index = x;
uint8_t *font_ptr; //汉字指针
for(i=0; i<strlen((char *)ascii); i++)
{
ascii_index = ascii[i];
//取到字模信息
font_ptr = Get_FontAscii_16x16(ascii_index);
//LCD显示
if(font_ptr != NULL)
{
LCD_Display_Ascii_16x16(index,y,font_ptr);
index += 8;
}
}
}
/*******************************************************************************
* 名称: UI_Menu_ShowMenu_16x16
* 描述: 显示菜单信息(用于区分语言)
* 输入参数: 无
* 输出参数: 无
* 其它:
*******************************************************************************/
void UI_Menu_ShowMenu_16x16(uint8_t x,uint8_t y,uint8_t *menu)
{
if(LCD.language==ENGLISH)
{
UI_Menu_ShowAscii_16x16(x,y,menu);
}
if(LCD.language==CHINESE)
{
UI_Menu_ShowChinese_16x16(x,y,menu);
}
}
/*******************************************************************************
* 名称: UI_Menu_ShowChinese_12x12
* 描述: 显示文本 12*12
* 输入参数: 无
* 输出参数: 无
* 其它:
*******************************************************************************/
void UI_Menu_ShowChinese_12x12(uint8_t x,uint8_t y,uint8_t *chinese)
{
uint8_t i = 0;
uint8_t chinese_buf[2]; //汉字数组信息
uint8_t index = x;
uint8_t *font_ptr; //汉字指针
for(i=0; i<strlen((char *)chinese)/2; i++)
{
//取到汉字字模的位置
chinese_buf[0] = chinese[i*2 + 0];
chinese_buf[1] = chinese[i*2 + 1];
//取到字模信息
font_ptr = Get_FontChinese_12x12(chinese_buf);
//LCD显示
if(font_ptr != NULL)
{
LCD_Display_Chinese_12x12(index,y,font_ptr);
index += 12;
}
}
}
/*******************************************************************************
* 名称: UI_Menu_ShowAscii_12x12
* 描述: 显示ascii 6*12
* 输入参数: 无
* 输出参数: 无
* 其它:
*******************************************************************************/
void UI_Menu_ShowAscii_12x12(uint8_t x,uint8_t y,uint8_t *ascii)
{
uint8_t i = 0;
uint8_t ascii_index = 0; //汉字数组信息
uint8_t index = x;
uint8_t *font_ptr; //汉字指针
for(i=0; i<strlen((char *)ascii); i++)
{
ascii_index = ascii[i];
//取到字模信息
font_ptr = Get_FontAscii_12x12(ascii_index);
//LCD显示
if(font_ptr != NULL)
{
LCD_Display_Ascii_12x12(index,y,font_ptr);
index += 6;
}
}
}
/*******************************************************************************
* 名称: UI_Menu_ShowMenu_12x12
* 描述: 显示菜单信息(用于区分语言)
* 输入参数: 无
* 输出参数: 无
* 其它:
*******************************************************************************/
void UI_Menu_ShowMenu_12x12(uint8_t x,uint8_t y,uint8_t *menu)
{
//if(gUserPara.Language == LANGUAGE_EN)
if(LCD.language==ENGLISH)
{
//UI_Menu_ShowAscii_12x12(x,y,menu);
UI_Menu_ShowAscii_12x12(0,y,menu);
}
//else if(gUserPara.Language == LANGUAGE_CN)
else if(LCD.language==CHINESE)
{
UI_Menu_ShowChinese_12x12(x,y,menu);
}
}
/*******************************************************************************
* 名称: UI_Menu_Init
* 描述: UI_Menu初始化
* 输入参数: 无
* 输出参数: 无
* 其它:
*******************************************************************************/
/*
void UI_Menu_Init(void)
{
Current_Handle = UIHandle_Main;
Current_Handle.Init(NULL); //初始化显示信息
}
*/
/*******************************************************************************
* 名称: UI_Menu_OpModeChange
* 描述: UI_Menu
* 输入参数: 无
* 输出参数: 无
* 其它:
*******************************************************************************/
/*
void UI_Menu_OpModeChange(MenuOPModeTypeDef mode, void *param)
{
switch(mode)
{
case OP_MODE_MAIN:
{
Current_Handle = UIHandle_Main;
Current_Handle.Init(NULL); //初始化显示信息
break;
}
case OP_MODE_MACADDR: //MAC
{
Current_Handle = UIHandle_MacAddr;
Current_Handle.Init(NULL); //初始化显示信息
UICommon.Last_MenuID = 7;
break;
}
case OP_MODE_UPDATE: //升级
{
Current_Handle = UIHandle_Update;
Current_Handle.Init(NULL); //初始化显示信息
break;
}
case OP_MODE_LANGUAGECHOICE: //语言选择
{
Current_Handle = UIHandle_LanguageChoice;
Current_Handle.Init(NULL); //初始化显示信息
UICommon.Last_MenuID = 4;
break;
}
case OP_MODE_SELFTEST_PRINT: //打印自检
{
Current_Handle = UIHandle_Selftest_Print;
Current_Handle.Init(NULL); //初始化显示信息
UICommon.Last_MenuID = 1;
break;
}
case OP_MODE_AUTO_POWEROFF: //自动关机
{
Current_Handle = UIHandle_AutoPoweroff;
Current_Handle.Init(NULL); //初始化显示信息
UICommon.Last_MenuID = 5;
break;
}
case OP_MODE_FIRMWARE_VERSION: //固件版本号
{
Current_Handle = UIHandle_Firmware_Version;
Current_Handle.Init(NULL); //初始化显示信息
UICommon.Last_MenuID = 8;
break;
}
case OP_MODE_FACTORY_SETTING: //恢复参数
{
Current_Handle = UIHandle_Factory_Setting;
Current_Handle.Init(NULL); //初始化显示信息
UICommon.Last_MenuID = 6;
break;
}
case OP_MODE_PAPER_TYPE: //纸张类型
{
Current_Handle = UIHandle_PaperType;
Current_Handle.Init(NULL); //初始化显示信息
UICommon.Last_MenuID = 2;
break;
}
case OP_MODE_AUTO_CALIBRATE: //自动定标
{
Current_Handle = UIHandle_AutoCalibrate;
Current_Handle.Init(NULL); //初始化显示信息
UICommon.Last_MenuID = 3;
break;
}
default:
{
break;
}
}
}
*/
/*******************************************************************************
* 名称: UI_StorePara
* 描述: UI配置存参
* 输入参数: 无
* 输出参数: 无
* 其它:
*******************************************************************************/
/*
static void UI_StorePara(void)
{
//跳主界面后 开始存参
1 -定标参数
if(UICommonStore.NeedStoreCaliFlag)
{
UICommonStore.NeedStoreCaliFlag = false;
gCalibratePara.SensorMode = UICommonStore.SensorMode; //纸张类型存储
CalibrateParaWritetoFlash(&gCalibratePara); //写定标参数
}
//2-用户参数
if(UICommonStore.NeedStoreLanguateFlag)
{
UICommonStore.NeedStoreLanguateFlag = false;
UserParaWritetoFlash(&gUserPara);
}
//3-存储定时时间信息
if(UICommonStore.NeedStorePowerOffTimeFlag)
{
UICommonStore.NeedStorePowerOffTimeFlag = false;
gUserPara.AutoPowerOffTimeEnum = UICommonStore.AutoPowerOffTimeEnum;
UserParaWritetoFlash(&gUserPara);
}
}
*/
/*******************************************************************************
* 名称: UI_Menu_Process
* 描述: UI_Menu定时调用
* 输入参数: 无
* 输出参数: 无
* 其它:
*******************************************************************************/
/*
void UI_Menu_Process(void)
{
uint32_t current_count = 0;
static uint32_t last_count = 0;
uint32_t backmain_current_count = 0;
static uint32_t backmain_last_count = 0;
KeyStateTypeEnum key_state_power = 0;
KeyStateTypeEnum key_state_feed = 0;
//----------------跳转主界面计时信息 10MS判断一次
backmain_current_count = SysTick_GetMyTick();
if(backmain_last_count != backmain_current_count)
{
backmain_last_count = backmain_current_count;
if(GlobalVar.Use_Key_Menu_Flag)
{
GlobalVar.UI_ReturnToMain_Count++;
if(GlobalVar.UI_ReturnToMain_Count > LCD_RETURN_MAIN_TIMEOUT)
{
GlobalVar.UI_ReturnToMain_Count = 0;
GlobalVar.Use_Key_Menu_Flag = false;
//跳到主界面去 如果当前非主界面
if(0 != memcmp(&Current_Handle, &UIHandle_Main, sizeof(ST_UI_HANDLE)))
{
UI_Menu_OpModeChange(OP_MODE_MAIN,NULL);
UI_StorePara(); //存参
}
}
}
else
{
GlobalVar.UI_ReturnToMain_Count = 0;
}
}
//-------------------按键刷新
if(false == GlobalVar.Use_Key_Menu_Flag)
{
key_state_power = Key_Get_State(KEY_POWER); //左按键按下后 按键被菜单接管
if(key_state_power == KEY_PRESS_SINGLE)
{
GlobalVar.Use_Key_Menu_Flag = true;
GlobalVar.UI_ReturnToMain_Count = 0; //跳过 计数器清0
AutoPowerOffClear(); //清除关机计数
Current_Handle.KeyEvent(KEY_POWER); //左键处理
AutoPowerOffClear(); //清除关机计数
MyPrintf("PowerKey Pressed\r\n");
}
//MyPrintf("PowerKey,Run to Screen\r\n");
}
//进入菜单模式 则进行处理
else if(true == GlobalVar.Use_Key_Menu_Flag)
{
key_state_power = Key_Get_State(KEY_POWER);
key_state_feed = Key_Get_State(KEY_FEED);
if((key_state_power == KEY_RELEASE) && (key_state_feed == KEY_PRESS_SINGLE))
{
GlobalVar.UI_ReturnToMain_Count = 0; //计数清0
Current_Handle.KeyEvent(KEY_FEED); //右键处理
AutoPowerOffClear(); //清除关机计数
}
if((key_state_power == KEY_PRESS_SINGLE) && (key_state_feed == KEY_RELEASE))
{
GlobalVar.UI_ReturnToMain_Count = 0; //计数清0
Current_Handle.KeyEvent(KEY_POWER); //左键处理
AutoPowerOffClear(); //清除关机计数
}
}
// //------------------------定时刷新 更新刷新频率
current_count = SysTick_GetMyTick();
if((current_count - last_count) > LCD_REFRESH_TIME)
{
last_count = current_count;
if((key_state_power == KEY_RELEASE) && (key_state_feed == KEY_RELEASE))
{
Current_Handle.KeyEvent(KEY_NULL); //没按键 则正常做刷新
}
}
}
*/
#endif
#define ADC_CH_GAP ADC_CHANNEL_1
#define ADC_CH_BM ADC_CHANNEL_2
#define ADC_CH_TM ADC_CHANNEL_3
#define ADC_CH_BAT ADC_CHANNEL_4
//DEBUG涓插彛閰?
#define UARTBAUD 115200
#define UART0_TX_PORT GPIOA
#define UART0_TX_PIN GPIO_Pin_1
#define UART0_RX_PORT GPIOA
#define UART0_RX_PIN GPIO_Pin_0
//TPH SPI IO
#define TPH_SPI SPI0
#define TPH_SPI_CLK_PORT GPIOB
#define TPH_SPI_CLK_PIN GPIO_Pin_14
#define TPH_SPI_MOSI_PORT GPIOB
#define TPH_SPI_MOSI_PIN GPIO_Pin_13
#define TPH_SPI_CS_PORT GPIOB
#define TPH_SPI_CS_PIN GPIO_Pin_15
#define TPH_STB1_PORT GPIOB
#define TPH_STB1_PIN GPIO_Pin_12 //加热
#define TPH_STB2_PORT GPIOB
#define TPH_STB2_PIN GPIO_Pin_11 //加热
#define TPH_MDEN_PORT GPIOC
#define TPH_MDEN_PIN GPIO_Pin_0
//FLASH SPI_FLASH IO
#define FLASH_SPI SPI1
#define FLASH_SPI_MOSI_PORT GPIOC
#define FLASH_SPI_MOSI_PIN GPIO_Pin_3
#define FLASH_SPI_MISO_PORT GPIOC
#define FLASH_SPI_MISO_PIN GPIO_Pin_5
#define FLASH_SPI_CLK_PORT GPIOC
#define FLASH_SPI_CLK_PIN GPIO_Pin_2
#define FLASH_SPI_CS_PORT GPIOC
#define FLASH_SPI_CS_PIN GPIO_Pin_4
#ifdef USE_LCD_IIC_PORT
//LCD I2C IO
#define LCD_IIC_SDA_PORT GPIOA
#define LCD_IIC_SDA_PIN GPIO_Pin_5
#define LCD_IIC_CLK_PORT GPIOA
#define LCD_IIC_CLK_PIN GPIO_Pin_4
#define LCD_RST_PORT GPIOA
#define LCD_RST_PIN GPIO_Pin_3
#define LCD_CS_PORT GPIOA
#define LCD_CS1_PIN GPIO_Pin_2
//#define LCD_PWR_PORT GPIOB
//#define LCD_PWR_PIN GPIO_Pin_0
#else
#define LCD_SDA_PORT GPIOA
#define LCD_SDA_PINT GPIO_Pin_5
#define LCD_CLK_PORT GPIOA
#define LCD_CLK_PIN GPIO_Pin_4
#define LCD_RST_PORT GPIOA
#define LCD_RST_PIN GPIO_Pin_3 //
#define LCD_CS_PORT GPIOA
#define LCD_CS1_PIN GPIO_Pin_2 // (没有用)
//#define LCD_DC_PORT GPIOA
//#define LCD_DC_PIN GPIO_Pin_15 //rxid -----------rfid
//#define LCD_PWR_PORT GPIOB
//#define LCD_PWR_PIN GPIO_Pin_0 //gap_e3 --------
#endif
#define Head_En_PORT GPIOA
#define Head_En_PIN GPIO_Pin_12 //head_en
//STEP MOTOR
#define STEP_MOTOR_A1_PORT GPIOC
#define STEP_MOTOR_A1_PIN GPIO_Pin_1
#define STEP_MOTOR_A2_PORT GPIOC
#define STEP_MOTOR_A2_PIN GPIO_Pin_10
#define STEP_MOTOR_B1_PORT GPIOC
#define STEP_MOTOR_B1_PIN GPIO_Pin_12
#define STEP_MOTOR_B2_PORT GPIOC
#define STEP_MOTOR_B2_PIN GPIO_Pin_11
#define STEP_MOTOR_EN_PORT GPIOA
#define STEP_MOTOR_EN_PIN GPIO_Pin_11
#define TPH_POWER_EN_PORT GPIOA
#define TPH_POWER_EN_PIN GPIO_Pin_11
// SERSOR IO
// 测试纸张位置的传感器
#define gap_e3_port GPIOB
#define gap_e3_pin GPIO_Pin_0 //gap_e3
#define gap_e2_port GPIOB
#define gap_e2_pin GPIO_Pin_5 //gap_e2
#define BM_E0_PORT GPIOB
#define BM_E0_PIN GPIO_Pin_6 //gap_e1
#define BM_E1_PORT GPIOB
#define BM_E1_PIN GPIO_Pin_10 //gap_e0
#define KEY_WAKE_PORT GPIOA
#define KEY_WAKE_PIN GPIO_Pin_13
#define KEY_SET_PORT GPIOA
#define KEY_SET_PIN GPIO_Pin_7
#define SYS_POWER_EN_PORT GPIOA //上电输出高
#define SYS_POWER_EN_PIN GPIO_Pin_9
//CHARGE-GET
#define PIN_CHARGE_STATE GPIO_Pin_8
#define PORT_CHARGE_STATE GPIOA
//#define SysTimerInt TIMER4_IRQHandler
//#define PrtTimerInt TIMER3_IRQHandler
//#define LFMotorInt TIMER2_IRQHandler
#endif
// C:\Users\Administrator\Desktop\PT26_Project\FreeRTOS\FreeRTOSConfig.h
/*
* FreeRTOS Kernel V10.0.1
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* http://www.FreeRTOS.org
* http://aws.amazon.com/freertos
*
* 1 tab == 4 spaces!
*/
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H
#include "yc3121.h"
#include "platform.h"
/*-----------------------------------------------------------
* Application specific definitions.
*
* These definitions should be adjusted for your particular hardware and
* application requirements.
*
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
*
* See http://www.freertos.org/a00110.html.
*----------------------------------------------------------*/
#define configUSE_PREEMPTION 1
#define configUSE_IDLE_HOOK 1
#define configUSE_TICK_HOOK 0
#define configCPU_CLOCK_HZ ( CPU_MHZ )
#define configTICK_RATE_HZ ( ( TickType_t ) TICK_RATE_HZ )
#define configMAX_PRIORITIES ( 5 )
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 10 * 1024 ) )
#define configMAX_TASK_NAME_LEN ( 8 )
#define configUSE_TRACE_FACILITY 0
#define configUSE_16_BIT_TICKS 0
#define configIDLE_SHOULD_YIELD 1
#define configUSE_MUTEXES 1
#define configCHECK_FOR_STACK_OVERFLOW 1
#define configGENERATE_RUN_TIME_STATS 0
#define configUSE_RECURSIVE_MUTEXES 1
#define configQUEUE_REGISTRY_SIZE 0
#define configUSE_COUNTING_SEMAPHORES 0
#define configUSE_MALLOC_FAILED_HOOK 1
#define configUSE_APPLICATION_TASK_TAG 0
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
#define configUSE_TASK_EXTENSION 0
/* Co-routine definitions. */
#define configUSE_CO_ROUTINES 0
#define configMAX_CO_ROUTINE_PRIORITIES (2)
/* Software timer definitions. */
#define configUSE_TIMERS 1
#define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 1 )
#define configTIMER_QUEUE_LENGTH 5
#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 5 )
/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */
#define INCLUDE_vTaskPrioritySet 1
#define INCLUDE_uxTaskPriorityGet 1
#define INCLUDE_vTaskDelete 1
#define INCLUDE_vTaskCleanUpResources 0
#define INCLUDE_vTaskSuspend 1
#define INCLUDE_vTaskDelayUntil 1
#define INCLUDE_vTaskDelay 1
/* This demo makes use of one or more example stats formatting functions. These
format the raw data provided by the uxTaskGetSystemState() function in to human
readable ASCII form. See the notes in the implementation of vTaskList() within
FreeRTOS/Source/tasks.c for limitations. */
#define configUSE_STATS_FORMATTING_FUNCTIONS 0
/*
enable queue sets
*/
#define configUSE_QUEUE_SETS 1
#endif /* FREERTOS_CONFIG_H */
// G:\Git_file\YC3121_PT26\Librarier\sdk\yc_lpm.c
#include "yc_lpm.h"
uint32_t lpm_read(volatile int *addr)
{
return ((uint32_t(*)(volatile int *addr))FUNC_LPM_READ_ADDR)(addr);
}
void lpm_write(volatile int *addr, uint32_t value)
{
((void(*)(volatile int *addr, uint32_t value))FUNC_LPM_WRITE_ADDR)(addr, value);
}
void lpm_bt_write(uint8_t type, uint32_t val)
{
// ((void(*)(uint8_t type,uint32_t val))FUNC_LPM_BT_WRITE_ADDR)(type,val);
enable_clock(CLKCLS_BT);
*(volatile uint8_t *)0xc804c = (val & 0x000000ff) >> 0;
delay_us(1);
*(volatile uint8_t *)0xc804d = (val & 0x0000ff00) >> 8;
delay_us(1);
*(volatile uint8_t *)0xc804e = (val & 0x00ff0000) >> 16;
delay_us(1);
*(volatile uint8_t *)0xc804f = (val & 0xff000000) >> 24;
delay_us(1);
*(volatile uint8_t *)0xc8005 = 1 << type;
delay_ms(1);
}
uint32_t lpm_bt_read(uint8_t type)
{
if (type == LPMBT_WKUPLOW || type == LPMBT_WKUPHIGH)
{
return (((uint32_t(*)(uint8_t type))FUNC_LPM_BT_READ_ADDR)(type)) >> 2;
}
else
{
return (((uint32_t(*)(uint8_t type))FUNC_LPM_BT_READ_ADDR)(type));
}
}
void lpm_sleep(void)
{
((void(*)())FUNC_LPM_SLEEP_ADDR)();
}
void setlpmval(volatile int *addr, uint8_t startbit, uint8_t bitwidth, uint32_t val)
{
((void(*)(volatile int *addr, uint8_t startbit, uint8_t bitwidth, uint32_t val))FUNC_SETLPMVAL_ADDR)(addr, startbit, bitwidth, val);
}
uint32_t readlpmval(volatile int *addr, uint8_t startbit, uint8_t bitwidth)
{
uint32_t tmp = 0;
if (32 == bitwidth)
{
tmp = lpm_read(addr);
return ((tmp >> startbit) & ((1 << bitwidth) - 1));
}
else
{
return lpm_read(addr);
}
}
void GPIO_Unused_Pd(void)
{
for (int i = 0; i < 48; i++)
{
if (GPIO_CONFIG(i) == 0 || GPIO_CONFIG(i) == 4 || GPIO_CONFIG(i) == 5)
{
GPIO_CONFIG(i) |= GPCFG_PD;
}
}
}
static uint32_t value_rtc_1s = 0;
static uint32_t get_otp(void)
{
uint32_t time;
if (value_rtc_1s == 0)
{
read_otp(0x13e, (uint8_t *)&time, 2);
time = (time == 0) ? 0x8000 : time;
time &= (~((uint32_t)0x1 << 31));
}
else
{
time = value_rtc_1s;
time |= ((uint32_t)0x1 << 31);
}
return time;
}
void BT_Hibernate(void)
{
#if (VERSIONS == EXIST_BT)
if(TRUE == ipc_inited)
{
ipc_inited = FALSE;
read_otp(0x13e, (uint8_t *)&value_rtc_1s, 2);
value_rtc_1s = (value_rtc_1s == 0) ? 0x8000 : value_rtc_1s;
BT_CONFIG &= ~(1 << BT_INIT_FLAG);
NVIC_DisableIRQ(BT_IRQn);
SYSCTRL_ROM_SWITCH = 0x90;
HCI_TypeDef IpcRxData;
IpcRxData.type = 1;
IpcRxData.opcode = 0x27;
IpcRxData.DataLen = 0;
IPC_TxData(&IpcRxData);
//delay(10000);
delay_ms(60);
}
#elif (VERSIONS == NO_BT || VERSIONS == NO_XTAL)
if(TRUE == ipc_inited)
{
ipc_inited = FALSE;
BT_CONFIG &= ~(1 << BT_INIT_FLAG);
NVIC_DisableIRQ(BT_IRQn);
SYSCTRL_ROM_SWITCH = 0x90;
lpm_bt_write(2,0);
delay_us(1000);
lpm_bt_write(3,0);
delay_us(1000);
lpm_bt_write(5,0);
delay_us(1000);
lpm_bt_write(1,0xd80000);
delay_us(1000);
lpm_bt_write(4,0x50000);
delay_us(1000);
}
#endif
}
void Chip_Speedstep(void)
{
SYSCTRL_HCLKConfig(SYSCTRL_HCLK_Div8);
}
void CM0_Sleep(uint32_t time, uint32_t GPIO_Pin0_Pin31, uint16_t GPIO_Pin32_Pin47, uint8_t islow_wakeup, uint8_t is_powerdownbt)
{
uint32_t temp;
SYSCTRL_AHBPeriphClockCmd(SYSCTRL_AHBPeriph_INTR | SYSCTRL_AHBPeriph_SHA | \
SYSCTRL_AHBPeriph_CRC | SYSCTRL_AHBPeriph_PWM | \
SYSCTRL_AHBPeriph_WDT | SYSCTRL_AHBPeriph_USB | \
SYSCTRL_AHBPeriph_SPI | SYSCTRL_AHBPeriph_DES | \
SYSCTRL_AHBPeriph_RSA | SYSCTRL_AHBPeriph_ASE | \
SYSCTRL_AHBPeriph_7816 | SYSCTRL_AHBPeriph_SM4 | \
SYSCTRL_AHBPeriph_7811 | SYSCTRL_AHBPeriph_ADC7811 | \
SYSCTRL_AHBPeriph_CP, DISABLE);
//DISABLE RTC WAKEUP
setlpmval(LPM_GPIO_WKHI, 17, 1, 0);
//set gpio wakeup level
setlpmval(LPM_GPIO_WKHI, 18, 1, islow_wakeup ? 1 : 0);
//set gpio num
if(GPIO_Pin0_Pin31!=0 || GPIO_Pin32_Pin47!=0)
{
for(int i = 0;i < 32;i++)
{
if((GPIO_Pin0_Pin31 & (1<<i)) != 0)
{
if (islow_wakeup)
GPIO_CONFIG(i) = PULL_UP;
else
GPIO_CONFIG(i) = PULL_DOWN;
}
}
for(int i = 0;i<16;i++)
{
if((GPIO_Pin32_Pin47 & (1<<i)) != 0)
{
if (islow_wakeup)
GPIO_CONFIG(i+32) = PULL_UP;
else
GPIO_CONFIG(i+32) = PULL_DOWN;
}
}
setlpmval(LPM_GPIO_WKUP, 0, 32, GPIO_Pin0_Pin31);
setlpmval(LPM_GPIO_WKHI, 0, 16, GPIO_Pin32_Pin47);
}
else
{
setlpmval(LPM_GPIO_WKUP, 0, 32, 0);
setlpmval(LPM_GPIO_WKHI, 0, 16, 0);
}
temp = get_otp();
if (time)
{
//SET SECMAX
setlpmval(LPM_SECMAX, 0, 16, temp);
//SET SLEEP CNT
setlpmval(LPM_WKUP_TIMER, 0, 32, time);
//clr RTC CNT
setlpmval(LPM_RTC_CNT, 0, 32, 0);
// ENABLE RTC WAKEUP
setlpmval(LPM_GPIO_WKHI, 17, 1, 1);
}
if (is_powerdownbt == 1 && (temp >> 31) == 0)
{
BT_Hibernate();
}
lpm_sleep();
}
void enable_gpio_32(void)
{
uint32_t value = lpm_bt_read(LPMBT_CONTROL1);
value &= ~(1<<17);
lpm_bt_write(LPMBT_CONTROL1, value);
}
// G:\Git_file\YC3121_PT26\Librarier\startup\flash_start.s
AREA |.flash_start|, CODE, READONLY ,ALIGN=4
Reset_Handler PROC
EXPORT Reset_Handler
IMPORT __main
LDR R0, =__main
BX R0
ENDP
hard_fault_handler PROC
EXPORT hard_fault_handler
ldr r0,=HARD_FAULT_IRQHandler
bx r0
nop
ENDP
svc_handler PROC
EXPORT svc_handler
ldr r0,=SVC_IRQHandler
bx r0
nop
ENDP
pendsv_handler PROC
EXPORT pendsv_handler
ldr r0,=PENDSV_IRQHandler
bx r0
nop
ENDP
systick PROC
EXPORT systick
ldr r0,=SYSTICK_IRQHandler
bx r0
nop
ENDP
irq0 PROC
EXPORT irq0
movs r0,#4*0
b isr
ENDP
irq1 PROC
EXPORT irq1
movs r0,#4*1
b isr
ENDP
irq2 PROC
EXPORT irq2
movs r0,#4*2
b isr
ENDP
irq3 PROC
EXPORT irq3
movs r0,#4*3
b isr
ENDP
irq4 PROC
EXPORT irq4
movs r0,#4*4
b isr
ENDP
irq5 PROC
EXPORT irq5
movs r0,#4*5
b isr
ENDP
irq6 PROC
EXPORT irq6
movs r0,#4*6
b isr
ENDP
irq7 PROC
EXPORT irq7
movs r0,#4*7
b isr
ENDP
irq8 PROC
EXPORT irq8
movs r0,#4*8
b isr
ENDP
irq9 PROC
EXPORT irq9
movs r0,#4*9
b isr
ENDP
irq10 PROC
EXPORT irq10
movs r0,#4*10
b isr
ENDP
irq11 PROC
EXPORT irq11
movs r0,#4*11
b isr
ENDP
irq12 PROC
EXPORT irq12
movs r0,#4*12
b isr
ENDP
irq13 PROC
EXPORT irq13
movs r0,#4*13
b isr
ENDP
irq14 PROC
EXPORT irq14
movs r0,#4*14
b isr
ENDP
irq15 PROC
EXPORT irq15
movs r0,#4*15
b isr
ENDP
irq16 PROC
EXPORT irq16
movs r0,#4*16
b isr
ENDP
irq17 PROC
EXPORT irq17
movs r0,#4*17
b isr
ENDP
irq18 PROC
EXPORT irq18
movs r0,#4*18
b isr
ENDP
irq19 PROC
EXPORT irq19
movs r0,#4*19
b isr
ENDP
irq20 PROC
EXPORT irq20
movs r0,#4*20
b isr
ENDP
irq21 PROC
EXPORT irq21
movs r0,#4*21
b isr
ENDP
irq22 PROC
EXPORT irq22
movs r0,#4*22
b isr
ENDP
irq23 PROC
EXPORT irq23
movs r0,#4*23
b isr
ENDP
irq24 PROC
EXPORT irq24
movs r0,#4*24
b isr
ENDP
irq25 PROC
EXPORT irq25
movs r0,#4*25
b isr
ENDP
irq26 PROC
EXPORT irq26
movs r0,#4*26
b isr
ENDP
irq27 PROC
EXPORT irq27
movs r0,#4*27
b isr
ENDP
irq28 PROC
EXPORT irq28
movs r0,#4*28
b isr
ENDP
irq29 PROC
EXPORT irq29
movs r0,#4*29
b isr
ENDP
irq30 PROC
EXPORT irq30
movs r0,#4*30
b isr
ENDP
irq31 PROC
EXPORT irq31
movs r0,#4*31
b isr
ENDP
isr PROC
ldr r1,=isr_table
ldr r0,[r0, r1]
bx r0
ENDP
ALIGN
NMI_IRQHandler PROC
EXPORT NMI_IRQHandler [WEAK]
B .
ENDP
HARD_FAULT_IRQHandler PROC
EXPORT HARD_FAULT_IRQHandler [WEAK]
B .
ENDP
SVC_IRQHandler PROC
EXPORT SVC_IRQHandler [WEAK]
B .
ENDP
PENDSV_IRQHandler PROC
EXPORT PENDSV_IRQHandler [WEAK]
B .
ENDP
SYSTICK_IRQHandler PROC
EXPORT SYSTICK_IRQHandler [WEAK]
B .
ENDP
EXTI0_IRQHandler PROC
EXPORT EXTI0_IRQHandler [WEAK]
B .
ENDP
EXTI1_IRQHandler PROC
EXPORT EXTI1_IRQHandler [WEAK]
B .
ENDP
EXTI2_IRQHandler PROC
EXPORT EXTI2_IRQHandler [WEAK]
B .
ENDP
EXTI3_IRQHandler PROC
EXPORT EXTI3_IRQHandler [WEAK]
B .
ENDP
EXTI4_IRQHandler PROC
EXPORT EXTI4_IRQHandler [WEAK]
B .
ENDP
EXTI5_IRQHandler PROC
EXPORT EXTI5_IRQHandler [WEAK]
B .
ENDP
Default_Handler PROC
; ToDo: Add here the export definition for the device specific external interrupts handler
EXPORT USB_IRQHandler [WEAK]
EXPORT IIC_IRQHandler [WEAK]
EXPORT QSPI_IRQHandler [WEAK]
EXPORT SPI0_IRQHandler [WEAK]
EXPORT SPI1_IRQHandler [WEAK]
EXPORT UART0_IRQHandler [WEAK]
EXPORT UART1_IRQHandler [WEAK]
EXPORT MEMCP_IRQHandler [WEAK]
EXPORT RSA_IRQHandler [WEAK]
EXPORT SCI0_IRQHandler [WEAK]
EXPORT SCI1_IRQHandler [WEAK]
EXPORT BT_IRQHandler [WEAK]
EXPORT GPIO_IRQHandler [WEAK]
EXPORT TIMER0_IRQHandler [WEAK]
EXPORT TIMER1_IRQHandler [WEAK]
EXPORT TIMER2_IRQHandler [WEAK]
EXPORT TIMER3_IRQHandler [WEAK]
EXPORT TIMER4_IRQHandler [WEAK]
EXPORT TIMER5_IRQHandler [WEAK]
EXPORT TIMER6_IRQHandler [WEAK]
EXPORT TIMER7_IRQHandler [WEAK]
EXPORT TIMER8_IRQHandler [WEAK]
EXPORT SM4_IRQHandler [WEAK]
EXPORT SEC_IRQHandler [WEAK]
EXPORT MSR_IRQHandler [WEAK]
EXPORT TRNG_IRQHandler [WEAK]
EXPORT WDT_IRQHandler [WEAK]
; ToDo: Add here the names for the device specific external interrupts handler
USB_IRQHandler
IIC_IRQHandler
QSPI_IRQHandler
SPI0_IRQHandler
SPI1_IRQHandler
UART0_IRQHandler
UART1_IRQHandler
MEMCP_IRQHandler
RSA_IRQHandler
SCI0_IRQHandler
SCI1_IRQHandler
BT_IRQHandler
GPIO_IRQHandler
TIMER0_IRQHandler
TIMER1_IRQHandler
TIMER2_IRQHandler
TIMER3_IRQHandler
TIMER4_IRQHandler
TIMER5_IRQHandler
TIMER6_IRQHandler
TIMER7_IRQHandler
TIMER8_IRQHandler
SM4_IRQHandler
SEC_IRQHandler
MSR_IRQHandler
TRNG_IRQHandler
WDT_IRQHandler
B .
ENDP
EXPORT isr_table
isr_table DCD USB_IRQHandler
DCD IIC_IRQHandler
DCD QSPI_IRQHandler
DCD SPI0_IRQHandler
DCD SPI1_IRQHandler
DCD UART0_IRQHandler
DCD UART1_IRQHandler
DCD MEMCP_IRQHandler
DCD RSA_IRQHandler
DCD SCI0_IRQHandler
DCD SCI1_IRQHandler
DCD BT_IRQHandler
DCD GPIO_IRQHandler
DCD TIMER0_IRQHandler
DCD TIMER1_IRQHandler
DCD TIMER2_IRQHandler
DCD TIMER3_IRQHandler
DCD TIMER4_IRQHandler
DCD TIMER5_IRQHandler
DCD TIMER6_IRQHandler
DCD TIMER7_IRQHandler
DCD TIMER8_IRQHandler
DCD SM4_IRQHandler
DCD SEC_IRQHandler
DCD MSR_IRQHandler
DCD TRNG_IRQHandler
DCD WDT_IRQHandler
END
// G:\Git_file\YC3121_PT26\Librarier\sdk\yc_uart.h
/*
File Name : yc_uart.c
Author : Yichip
Version : V1.0
Date : 2019/12/4
Description : UART encapsulation.
*/
#ifndef __YC_UART_H__
#define __YC_UART_H__
#include "yc3121.h"
/** @def time of UART receive data time out intterrupt. real time = regvalue*48
* @{
*/
#define TIME_IT_TIMEOUT (uint16_t)0x01
/** @defgroup USART_Mode
* @{
*/
#define Mode_Single_Line (1<<6)
#define Mode_duplex (0<<6)
#define IS_MODE(MODE) (((MODE) == Mode_Single_Line) ||\
((MODE) == Mode_duplex))
/**
* @}
*/
/** @
* @defgroup USART_DataBits
*/
#define Databits_8b (0<<2)
#define Databits_9b (1<<2)
#define IS_USART_WORD_LENGTH(LENGTH) (((LENGTH) == Databits_8b) || \
((LENGTH) == Databits_9b))
/**
* @}
*/
/** @defgroup USART_Stop_Bits
* @{
*/
#define StopBits_1 (0<<3)
#define StopBits_2 (1<<3)
#define IS_USART_STOPBITS(STOPBITS) (((STOPBITS) == StopBits_1) || \
((STOPBITS) == StopBits_2) )
/**
* @}
*/
/** @defgroup USART_Hardware_Flow_Control
* @{
*/
#define FlowCtrl_None (0<<4)
#define FlowCtrl_Enable (1<<4)
#define IS_FlowCtrl(CONTROL) (((CONTROL) == FlowCtrl_None) || \
((CONTROL) == FlowCtrl_Enable))
/**
* @}
*/
/** @defgroup UART_Interrupt_Type_definition
* @{
*/
#define UART_IT_TX 0x01
#define UART_IT_RX 0x02
#define IS_UART_IT(x) (x == UART_IT_TX)||(x == UART_IT_RX)
/**
* @}
*/
/** @defgroup USART_Parity
* @{
*/
#define Parity_None (0<<1)
#define Parity_Even (0<<1)
#define Parity_Odd (1<<1)
#define IS_PARITY(PARITY) (((PARITY) == Parity_Even) ||\
((PARITY) == Parity_None) ||\
((PARITY) == Parity_Odd))
/**
* @}
*/
/** @defgroup USART_BaudRate
* @{
*/
#define IS_BAUDRATE(BAUDRATE) (((BAUDRATE) > 0x5B8) && ((BAUDRATE) < 0x0044AA21))
/**
* @}
*/
typedef struct
{
uint8_t Mode; /*!< Specifies wether the Receive or Transmit mode is enabled or disabled.
This parameter can be a value of @ref USART_Mode */
uint32_t BaudRate; /*!< This member configures the USART communication baud rate. */
uint8_t DataBits; /*!< Specifies the number of data bits transmitted or received in a frame.
This parameter can be a value of @ref USART_DataBits */
uint8_t StopBits; /*!< Specifies the number of stop bits transmitted.
This parameter can be a value of @ref USART_Stop_Bits */
uint8_t Parity; /*!< Specifies the parity mode.
This parameter can be a value of @ref USART_Parity
@note When parity is enabled, the computed parity is inserted
at the MSB position of the transmitted data (9th bit when
the word length is set to 9 data bits; 8th bit when the
word length is set to 8 data bits). */
uint8_t FlowCtrl; /*!< Specifies wether the hardware flow control mode is enabled or disabled.
This parameter can be a value of @ref USART_Hardware_Flow_Control */
int RxBufLen; /*!< Specifies uart DMA Rx buff length */
} UART_InitTypeDef;
/** @defgroup UART_TypeDef
* @{
*/
typedef enum
{
UART0 = 0,
UART1,
} UART_TypeDef;
#define IS_UART(UARTx) (UARTx == UART0 ||UARTx == UART1)
/**
* @}
*/
/**
* @brief ENABLE or DISABLE UARTx auto flow control
* @param USARTx: Select the USART or the UART peripheral.
* This parameter can be one of the following values:
* UART0, UART1.
* @param NewState:ENABLE or DISABLE auto flow control
* @retval None
*/
void UART_AutoFlowCtrlCmd(UART_TypeDef UARTx, FunctionalState NewState);
/**
* @brief Clear IT
* @param USARTx: Select the USART or the UART peripheral.
* This parameter can be one of the following values:
* UART0, UART1.
* @retval None
*/
void UART_ClearIT(UART_TypeDef UARTx);
/**
* @brief DeInit UART
* @param UARTx: Select the UART peripheral.
* This parameter can be one of the following values:
* UART0, UART1.
* @retval None
*/
void UART_DeInit(UART_TypeDef UARTx);
/**
* @brief Transmits datas via UART DMA .
* @param USARTx: Select the USART or the UART peripheral.
* This parameter can be one of the following values:
* UART0, UART1.
* @param buf: pointer to a buf that contains the data you want transmit.
* @param len: the buf length
* @retval None
*/
void UART_DMASendBuf(UART_TypeDef UARTx, uint8_t *buf, int len);
/**
* @brief Get IT Identity
* @param UARTx: Select the UART peripheral.
* @retval IT Identity
*/
uint8_t UART_GetITIdentity(UART_TypeDef UARTx);
/**
* @brief Initializes the USARTx peripheral according to the specified
* parameters in the USART_InitStruct .
* @param UARTx: Select the UART peripheral.
* This parameter can be one of the following values:
* UART0, UART1.
* @param USART_InitStruct: pointer to a USART_InitTypeDef structure
* that contains the configuration information for the specified USART
* peripheral.
* @retval None
*/
void UART_Init(UART_TypeDef UARTx, UART_InitTypeDef *UART_InitStruct);
/**
* @brief Judge Rx fifo full is or not.
* @param UARTx: Select the UART peripheral.
* @retval TRUE:Rx fifo is full.
* FALSE:Rx fifo is not full
*/
Boolean UART_IsRXFIFOFull(UART_TypeDef UARTx);
/**
* @brief Judge Rx fifo empty is or not.
* @param UARTx: Select the UART peripheral.
* @retval TRUE:Rx fifo is not empty.
* FALSE:Rx fifo is empty;
*/
Boolean UART_IsRXFIFONotEmpty(UART_TypeDef UARTx);
/**
* @brief Judge UART is Busy or not
* @param UARTx: Select the UART peripheral.
* @retval None
*/
Boolean UART_IsUARTBusy(UART_TypeDef UARTx);
/**
* @brief Config Interrupt trigger mode
* @param USARTx: Select the USART or the UART peripheral.
* This parameter can be one of the following values:
* UART0, UART1.
* @param UART_IT: Interrupt trigger mode ,this param will the following values,
* UART_IT_TX:interrupt trigger after send data completed.
* UART_IT_RX:interrupt trigger when received data.
* @param NewState:
* @retval None
*/
void UART_ITConfig(UART_TypeDef UARTx, uint32_t UART_IT, FunctionalState NewState);
/**
* @brief Receive single data through the USARTx peripheral.
* @param USARTx: Select the USART or the UART peripheral.
* This parameter can be one of the following values:
* UART0, UART1.
* @retval None
*/
uint8_t UART_ReceiveData(UART_TypeDef UARTx);
/**
* @brief Receives datas through the UART DMA.
* @param USARTx: Select the USART or the UART peripheral.
* This parameter can be one of the following values:
* UART0, UART1.
* @param buf: pointer to a buf that contains the data you want receive.
* @param len: the buf length
* @retval None
*/
int UART_RecvBuf(UART_TypeDef UARTx, uint8_t *buf, int len);
/**
* @brief T ransmits datas via UART DMA,the function will return after datas is sent.
* @param USARTx: Select the USART or the UART peripheral.
* This parameter can be one of the following values:
* UART0, UART1.
* @param buf: pointer to a buf that contains the data you want transmit.
* @param len: the buf length
* @retval None
*/
void UART_SendBuf(UART_TypeDef UARTx, uint8_t *buf, int len);
/**
* @brief UART Send One Data
* @param UARTx: Select the UART peripheral.
* @retval None
*/
void UART_SendData(UART_TypeDef UARTx, uint8_t Data);
/**
* @brief UART_SetITTimeout
* @param USARTx: Select the USART or the UART peripheral.
* This parameter can be one of the following values:
* UART0, UART1.
* timeout: 0x0000~0xffff
* @retval None
*/
void UART_SetITTimeout(UART_TypeDef UARTx, uint16_t timeout);
/**
* @brief Set the number of uart receive data intterupt trigger
* @param UARTx: Select the UART peripheral.
* This parameter can be one of the following values:
* UART0, UART1.
* @param Bcnt: if the number of receive datas greater than Bcnt,interrupt trigger
* @retval None
*/
void UART_SetRxITNum(UART_TypeDef UARTx, uint8_t Bcnt);
/**
* @brief Fills each USART_InitStruct member with its default value.
* @param USART_InitStruct: pointer to a USART_InitTypeDef structure
* which will be initialized.
* @retval None
*/
void UART_StructInit(UART_InitTypeDef *UART_InitStruct);
/**
* @brief UART_ReceiveDataLen
* @param UARTx: UART0 or UART1
* @retval Data len
*/
uint16_t UART_ReceiveDataLen(UART_TypeDef UARTx);
#endif /*__YC_UART_H__*/
// G:\Git_file\YC3121_PT26\Librarier\sdk\yc_uart.c
/*
File Name : yc_uart.c
Author : Yichip
Version : V1.0
Date : 2019/12/4
Description : UART encapsulation.
*/
#include "yc_uart.h"
#define uart_DMA_buf_len 1024
uint8_t uart0_DMA_buf[uart_DMA_buf_len] = {0};
uint8_t uart1_DMA_buf[uart_DMA_buf_len] = {0};
#define RX_ENABLE_BIT 0
#define RX_ENABLE (1 << RX_ENABLE_BIT)
#define UART_DMA_ENABLE_BIT 31
#define UART_DMA_ENABLE (1<<UART_DMA_ENABLE_BIT)
#define TX_INTR_ENABLE_BIT 31
#define TX_INTR_ENABLE ((uint32_t)1<< TX_INTR_ENABLE_BIT)
#define Set_RxITNum_Mask 0xff00
#define Statu_RxNum_Mask (uint32_t)0xffff0000
void UART_AutoFlowCtrlCmd(UART_TypeDef UARTx, FunctionalState NewState)
{
_ASSERT(IS_UART(UARTx));
if (NewState == ENABLE)
{
switch (UARTx)
{
case UART0:
UART0_CTRL |= FlowCtrl_Enable;
break;
case UART1:
UART1_CTRL |= FlowCtrl_Enable;
break;
}
}
else
{
switch (UARTx)
{
case UART0:
UART0_CTRL &= (~FlowCtrl_Enable);
break;
case UART1:
UART1_CTRL &= (~FlowCtrl_Enable);
break;
}
}
return;
}
void UART_ClearIT(UART_TypeDef UARTx)
{
uint8_t ITType = UART_GetITIdentity(UARTx);
UART_ITConfig(UARTx, ITType, DISABLE);
}
void UART_DeInit(UART_TypeDef UARTx)
{
_ASSERT(IS_UART(UARTx));
switch (UARTx)
{
case UART0:
UART0_CTRL = 0;
break;
case UART1:
UART1_CTRL = 0;
break;
}
}
void UART_DMASendBuf(UART_TypeDef UARTx, uint8_t *buf, int len)
{
_ASSERT(IS_UART(UARTx));
_ASSERT(NULL != buf);
_ASSERT((len < 0xffff));
if (UARTx == UART0)
{
DMA_SRC_ADDR(DMACH_UART0) = (int)buf;
DMA_LEN(DMACH_UART0) = (DMA_LEN(DMACH_UART0) & 0xffff) | len << 16;
DMA_START(DMACH_UART0) = (1 << DMA_START_BIT);
}
else
{
DMA_SRC_ADDR(DMACH_UART1) = (int)buf;
DMA_LEN(DMACH_UART1) = (DMA_LEN(DMACH_UART1) & 0xffff) | len << 16;
DMA_START(DMACH_UART1) = (1 << DMA_START_BIT);
}
}
uint8_t UART_GetITIdentity(UART_TypeDef UARTx)
{
uint8_t IT_Mode = 0;
switch (UARTx)
{
case UART0:
{
if (((UART0_CTRL & Set_RxITNum_Mask) > 0) && ((UART0_STATUS >> 16) > 0))
{
IT_Mode = UART_IT_RX;
}
else
{
if ((UART0_CTRL & (uint32_t)TX_INTR_ENABLE))
{
IT_Mode = UART_IT_TX;
}
else
{
IT_Mode = FALSE;
}
}
}
break;
case UART1:
{
if (((UART1_CTRL & Set_RxITNum_Mask) > 0) && ((UART1_STATUS >> 16) > 0))
{
IT_Mode = UART_IT_RX;
}
else
{
if (UART1_CTRL & TX_INTR_ENABLE)
{
IT_Mode = UART_IT_TX;
}
else
{
IT_Mode = FALSE;
}
}
}
break;
}
return IT_Mode;
}
void UART_Init(UART_TypeDef UARTx, UART_InitTypeDef *UART_InitStruct)
{
#define RESET_BAUD (1<<7)
#define AUTO_BAUD (0<<7)
uint32_t reg_value = 0;
uint32_t temp_baudrate = 0;
_ASSERT(IS_UART(UARTx));
_ASSERT(IS_MODE(UART_InitStruct->Mode));
_ASSERT(IS_BAUDRATE(UART_InitStruct->BaudRate));
_ASSERT(IS_PARITY(UART_InitStruct->Parity));
_ASSERT(IS_FlowCtrl(UART_InitStruct->FlowCtrl));
_ASSERT(IS_USART_STOPBITS(UART_InitStruct->StopBits));
temp_baudrate = ((48000000 / UART_InitStruct->BaudRate) << 16);
reg_value = RX_ENABLE |
UART_InitStruct->Parity | \
UART_InitStruct->DataBits | \
UART_InitStruct->StopBits | \
UART_InitStruct->FlowCtrl | \
UART_InitStruct->Mode | \
RESET_BAUD | \
temp_baudrate;
if (UARTx == UART0)
{
UART0_CTRL = 0;
DMA_DEST_ADDR(DMACH_UART0) = (int)uart0_DMA_buf;
DMA_LEN(DMACH_UART0) = uart_DMA_buf_len;
DMA_CONFIG(DMACH_UART0) = 1;
DMA_START(DMACH_UART0) |= (1 << (DMA_RESET_BIT));
DMA_START(DMACH_UART0) &= ~(1 << (DMA_RESET_BIT));
UART0_CTRL = 0;
UART0_CTRL = reg_value;
}
else
{
UART1_CTRL = 0;
DMA_DEST_ADDR(DMACH_UART1) = (int)uart1_DMA_buf;
DMA_LEN(DMACH_UART1) = uart_DMA_buf_len;
DMA_CONFIG(DMACH_UART1) = 1;
DMA_START(DMACH_UART1) |= (1 << (DMA_RESET_BIT));
DMA_START(DMACH_UART1) &= ~(1 << (DMA_RESET_BIT));
UART1_CTRL = 0;
UART1_CTRL = reg_value;
}
return;
}
Boolean UART_IsRXFIFOFull(UART_TypeDef UARTx)
{
#define BITRXFULL 1
_ASSERT(IS_UART(UARTx));
if (UART0 == UARTx)
{
return (Boolean)(UART0_STATUS & (1 << BITRXFULL));
}
else
{
return (Boolean)(UART1_STATUS & (1 << BITRXFULL));
}
}
Boolean UART_IsRXFIFONotEmpty(UART_TypeDef UARTx)
{
#define BITRXEMPTY 0
_ASSERT(IS_UART(UARTx));
if (UART0 == UARTx)
{
return (Boolean)((UART0_STATUS >> 16) ? 1 : 0);
}
else
{
return (Boolean)((UART1_STATUS >> 16) ? 1 : 0);
}
}
Boolean UART_IsUARTBusy(UART_TypeDef UARTx)
{
_ASSERT(IS_UART(UARTx));
if (UART0 == UARTx)
{
return (Boolean)(!(DMA_STATUS(DMACH_UART0) & 1));
}
else
{
return (Boolean)(!(DMA_STATUS(DMACH_UART1) & 1));
}
}
void UART_ITConfig(UART_TypeDef UARTx, uint32_t UART_IT, FunctionalState NewState)
{
_ASSERT(IS_UART(UARTx));
_ASSERT(IS_UART_IT(UART_IT));
switch (UARTx)
{
case UART0:
{
if (UART_IT == UART_IT_RX)
{
if (NewState)
{
UART0_CTRL |= ((ENABLE << 8));
}
else
{
UART0_CTRL &= ~Set_RxITNum_Mask;
}
}
else if (UART_IT == UART_IT_TX)
{
UART0_CTRL &= (~TX_INTR_ENABLE);
UART0_CTRL |= (NewState << TX_INTR_ENABLE_BIT);
}
}
break;
case UART1:
{
if (UART_IT == UART_IT_RX)
{
if (NewState)
{
UART1_CTRL |= ((ENABLE << 8));
}
else
{
UART1_CTRL &= ~Set_RxITNum_Mask;
}
}
else if (UART_IT == UART_IT_TX)
{
UART1_CTRL &= (uint32_t)~TX_INTR_ENABLE;
UART1_CTRL |= (NewState << TX_INTR_ENABLE_BIT);
}
}
break;
}
}
uint8_t UART_ReceiveData(UART_TypeDef UARTx)
{
_ASSERT(IS_UART(UARTx));
if (UART0 == UARTx)
{
return UART0_RDATA;
}
else
{
return UART1_RDATA;
}
}
int UART_RecvBuf(UART_TypeDef UARTx, uint8_t *buf, int len)
{
uint32_t length = 0;
volatile int *pstatus = NULL;
volatile unsigned char *pdata = NULL;
_ASSERT(IS_UART(UARTx));
_ASSERT(NULL != buf);
if (UART0 == UARTx)
{
pstatus = &UART0_STATUS;
pdata = &UART0_RDATA;
}
else
{
pstatus = &UART1_STATUS;
pdata = &UART1_RDATA;
}
while ((*pstatus >> 16) > 0)
{
if (length < len)
{
buf[length++] = *pdata;
}
else
{
break;
}
}
return length;
}
void UART_SendBuf(UART_TypeDef UARTx, uint8_t *buf, int len)
{
_ASSERT(IS_UART(UARTx));
_ASSERT(NULL != buf);
_ASSERT((len < 0xffff));
if (UARTx == UART0)
{
DMA_SRC_ADDR(DMACH_UART0) = (int)buf;
DMA_LEN(DMACH_UART0) = (DMA_LEN(DMACH_UART0) & 0xffff) | len << 16;
DMA_START(DMACH_UART0) = (1 << DMA_START_BIT);
while ((!(DMA_STATUS(DMACH_UART0) & 1)));
}
else
{
DMA_SRC_ADDR(DMACH_UART1) = (int)buf;
DMA_LEN(DMACH_UART1) = (DMA_LEN(DMACH_UART1) & 0xffff) | len << 16;
DMA_START(DMACH_UART1) = (1 << DMA_START_BIT);
while ((!(DMA_STATUS(DMACH_UART1) & 1)));
}
}
void UART_SendData(UART_TypeDef UARTx, uint8_t Data)
{
uint8_t buf[1] = {Data};
if (UARTx == UART0)
{
DMA_SRC_ADDR(DMACH_UART0) = (int)buf;
DMA_LEN(DMACH_UART0) = (DMA_LEN(DMACH_UART0) & 0xffff) | 1 << 16;
DMA_START(DMACH_UART0) = (1 << DMA_START_BIT);
while (!(DMA_STATUS(DMACH_UART0) & 1));
}
else
{
DMA_SRC_ADDR(DMACH_UART1) = (int)buf;
DMA_LEN(DMACH_UART1) = (DMA_LEN(DMACH_UART1) & 0xffff) | 1 << 16;
DMA_START(DMACH_UART1) = (1 << DMA_START_BIT);
while (!(DMA_STATUS(DMACH_UART1) & 1));
}
}
void UART_SetITTimeout(UART_TypeDef UARTx, uint16_t timeout)
{
if (UART0 == UARTx)
{
UART0_INTR = timeout;
}
else
{
UART1_INTR = timeout;
}
}
void UART_SetRxITNum(UART_TypeDef UARTx, uint8_t Bcnt)
{
_ASSERT(IS_UART(UARTx));
if (UART0 == UARTx)
{
UART0_CTRL = (UART0_CTRL & 0xffff00ff) | ((Bcnt & 0xff) << 8);
}
else
{
UART1_CTRL = (UART1_CTRL & 0xffff00ff) | ((Bcnt & 0xff) << 8);
}
}
void UART_StructInit(UART_InitTypeDef *UART_InitStruct)
{
UART_InitStruct->BaudRate = 9600;
UART_InitStruct->DataBits = Databits_8b;
UART_InitStruct->FlowCtrl = FlowCtrl_None ;
UART_InitStruct->Mode = Mode_duplex;
UART_InitStruct->StopBits = StopBits_1;
UART_InitStruct->Parity = 0;
}
uint16_t UART_ReceiveDataLen(UART_TypeDef UARTx)
{
_ASSERT(IS_UART(UARTx));
if (UART0 == UARTx)
{
return (uint16_t)(UART0_STATUS >> 16);
}
else
{
return (uint16_t)(UART1_STATUS >> 16);
}
}
PT26_HAL:相关文件
于 2024-04-18 20:54:24 首次发布