|
里面有完整的资料
单片机源程序如下:
- /* 包含的头文件 --------------------------------------------------------------*/
- #include "bsp.h"
- #include "HSJ121.h"
- #include "i2c.h"
- #include "timer.h"
- #include "aboutdata.h"
- uint8_t HSJ121_SendData[HSJ121_SendDataLength]; //命令发送数据
- uint8_t HSJ121_ReciveData[HSJ121_ReciveDataLength]; //数据回复接收
- uint8_t HSJ121_Mode_LowScan[HSJ121ModeSetLength]={0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x80,0x0A}; //低速扫描
- uint8_t HSJ121_Mode_NearInduction[HSJ121ModeSetLength]={0x01,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x80,0x0A}; //临场接近感应
- uint8_t HSJ121_KeyScanTime[HSJ121_KeyScanTimeLength]={02,05}; //按键扫描时间
- //函数声明(内部调用)
- uint8_t HSJ121_SendAndRecive(uint8_t *SendData,uint8_t *ReciveData); //发送和接收
- uint8_t HSJ121_SendComByIIC(uint8_t sla,uint8_t *s,uint8_t num); //通过IIC发送命令
- uint8_t HSJ121_RecDataByIIC(uint8_t sla,uint8_t *s); //通过IIC接收回复数据
- //函数声明(外部调用)
- void HSJ121Init(void); //模块初始化
- uint8_t HSJ121_Set_LowScanMode(uint8_t *Mode); //设置低速扫描模式
- uint8_t HSJ121_Set_NearInductionMode(uint8_t *Mode); //设置临近感应模式
- uint8_t HSJ121_Get_Config(void); //获取配置信息
- uint8_t HSJ121_Get_Key(void); //获取键值
- uint8_t HSJ121_Set_ScanTime(uint8_t *ScanTme); //设置按键扫描时间
- uint8_t HSJ121_Get_ScanTime(void); //获取按键扫描时间
- uint8_t HSJ121_Set_SleepMode(void); //设置睡眠模式
- uint8_t HSJ121_Into_SleepMode(void); //进入睡眠模式
- uint8_t HSJ121_WakeUp(void); //唤醒芯片
- /*--------------------------内部调用函数---------------------------------------*/
- /************************************************
- 函数名称 : SendComByIIC
- 功 能 : 通过IIC发送命令数据帧
- 参 数 : uint8_t sla —— 器件地址
- uint8_t *s —— 命令数据缓冲区
- uint8_t num —— 命令长度
- 返 回 值 : TRUE —— 正确
- FALSE —— 错误
- 作 者 :
- *************************************************/
- uint8_t HSJ121_SendComByIIC(uint8_t sla,uint8_t *s,uint8_t num)
- {
- uint8_t i,j;
- uint8_t ack=2;
- I2C_Start(); //启动信号
- //发送器件地址
- ack=I2C_WriteByte(sla|I2C_WR);
- if(ack==I2C_NOACK){
- // printf("send address fail by write\n");
- return FALSE;
- }else if(ack==I2C_ACK){
- // printf("send address success by write\n");
- }
- TIMDelay_Nms(1); //延时
- //循环发送命令数据帧
- for(i=0;i<num;i++)
- {
- ack=I2C_WriteByte(*s);
- if(ack==I2C_NOACK){
- // printf("send command data fail\n");
- return FALSE;
- }
- s++;
- TIMDelay_Nms(1); //延时
- }
- I2C_Stop(); //停止信号
- return TRUE;
- }
- /************************************************
- 函数名称 : RecDataByIIC
- 功 能 : 通过IIC接收模块返回数据帧
- 参 数 : uint8_t sla —— 器件地址
- uint8_t *s —— 接收回复数据帧缓冲区
- uint8_t num —— 回复数据帧长度
- 返 回 值 : TRUE —— 正确
- FALSE —— 错误
- 作 者 :
- *************************************************/
- uint8_t HSJ121_RecDataByIIC(uint8_t sla,uint8_t *s)
- {
- uint8_t i=0;
- uint8_t HSJ121_Length;
- uint8_t j=0;
- uint8_t ack=2;
- uint8_t num;
-
- j=250;
- while(1)
- {
- I2C_Start(); //启动信号
- ack=I2C_WriteByte(sla+1); //发送器件地址+写入命令
- // TIMDelay_Nms(5); //延时
- if(ack==I2C_ACK){
- // printf("Send address success by read\n");
- break; //模块应答成功,退出循环,准备接收数据
- }
- //模块超时没有应答,返回出错
- if(j--==0){
- I2C_Stop();
- // printf("Send address fail by read\n");
- return FALSE;
- }
- }
-
- // TIMDelay_Nms(1000); //延时
- HSJ121_Length=I2C_ReadByte(I2C_ACK); //接收第一个字节数据,获取数据帧长度
- *s = HSJ121_Length;
- s++;
-
- if(HSJ121_Length==0x00){
- I2C_Stop();
- return FALSE;
- }
-
- for(i=0;i<HSJ121_Length-1;i++) //循环接受数据(除校验码外)
- {
- *s=I2C_ReadByte(I2C_ACK);
- s++;
- }
-
- //接收检验码
- *s=I2C_ReadByte(I2C_NOACK);
- I2C_Stop(); //停止信号
- return TRUE;
- }
- /************************************************
- 函数名称 : HSJ121_SendAndRecive(uint8_t *SendData,uint8_t *ReciveData)
- 功 能 : 命令发送和回复数据接收
- 参 数 : *SendData -- 发送命令缓冲区
- *ReciveData -- 接收数据缓冲区
- 返 回 值 : TRUE —— 正确
- FALSE —— 错误
- 作 者 :
- *************************************************/
- uint8_t HSJ121_SendAndRecive(uint8_t *SendData,uint8_t *ReciveData)
- {
- uint8_t Command;
- uint8_t RepetCnt=5;
-
- Command=SendData[CMD];
-
- SendData[SendData[Length]]=GetBcc(SendData,SendData[Length]); //获取BCC校验码
-
- //发送命令数据帧
- while(RepetCnt) //重复次数,循环几次,避免模块没有及时发出ACK而退出
- {
- RepetCnt--;
- //发送命令数据帧
- if(HSJ121_SendComByIIC(HSJ121_ADD,SendData,(SendData[Length]+1))==TRUE){
- // printf("Send command success\n");
- break;
- }
- //发送命令数据帧出错
- if(RepetCnt==0){
- // printf("IIC send command timeout\n");
- return FALSE;
- }
- }
-
- TIMDelay_Nms(5);
- RepetCnt=250;
-
- //接收模块返回数据帧
- while(RepetCnt)
- {
- RepetCnt--;
-
- if(HSJ121_RecDataByIIC(HSJ121_ADD,ReciveData)==TRUE){
- // printf("Receive data success\n");
- break;
- }
-
- //接收模块返回数据帧出错
- if(RepetCnt==0){
- // printf("IIC receive data timeout\n");
- return FALSE;
- }
- }
-
- //对模块返回的数据帧进行校验
- if(!GetBcc(ReciveData,ReciveData[Length]+1)){
- // printf("Bcc check success\n");
- if(Command==ReciveData[CMD]){
- // printf("Command check success\n");
- return TRUE; //校验成功
- }else{
- // printf("Command check success\n");
- }
- }else{
- // printf("Bcc check fail\n");
- }
- return FALSE;
- }
- /*--------------------------外部调用函数---------------------------------------*/
- /******************************************/
- //函数原型: void HSJ121Init(void)
- //输入参数: 无
- //输出参数: 无
- //函数返回:
- //功能描述: 芯片初始化
- /******************************************/
- void HSJ121Init(void)
- {
- I2C_Initializes(); //I2C通信初始化
- TIMDelay_Nms(10); //上电等待3ms,芯片稳定
- printf("HSJ121 init success\n");
-
- }
- /******************************************/
- //函数原型: HSJ121_Set_LOWScanMode(uint8_t *Mode)
- //输入参数: *Mode 设置模式码(10个字节)
- //输出参数: 无
- //函数返回: TRUE or FALSE
- //功能描述: 设置低速扫描模式
- /******************************************/
- uint8_t HSJ121_Set_LowScanMode(uint8_t *Mode)
- {
- uint8_t State;
- EXTI->IMR&=~(1<<13); //屏蔽13线上中断
-
- ClearData(HSJ121_SendData,HSJ121_SendDataLength); //清零发送数据
- ClearData(HSJ121_ReciveData,HSJ121_ReciveDataLength); //清零接收数据
-
- HSJ121_SendData[Length]=0x0C; //添加数据长度
- HSJ121_SendData[CMD]=0x70; //添加命令码
- CopyData(&HSJ121_SendData[DataPOS],Mode,10);
-
- State=HSJ121_SendAndRecive(HSJ121_SendData,HSJ121_ReciveData);
-
- // 将模块回复的数据从HEX码转成Char
- HexToChar(HSJ121_ReciveData,(HSJ121_ReciveData[Length]+1));
-
- EXTI->IMR|=1<<13; //开13线上中断
- return State;
- }
- /******************************************/
- //函数原型: HSJ121_Set_NearInductionMode(uint8_t *Mode)
- //输入参数: *Mode 设置模式码(10个字节)
- //输出参数: 无
- //函数返回: TRUE or FALSE
- //功能描述: 设置临近感应模式
- /******************************************/
- uint8_t HSJ121_Set_NearInductionMode(uint8_t *Mode)
- {
- uint8_t State;
- EXTI->IMR&=~(1<<13); //屏蔽13线上中断
-
- ClearData(HSJ121_SendData,HSJ121_SendDataLength); //清零发送数据
- ClearData(HSJ121_ReciveData,HSJ121_ReciveDataLength); //清零接收数据
-
- HSJ121_SendData[Length]=0x0C; //添加数据长度
- HSJ121_SendData[CMD]=0x70; //添加命令码
- CopyData(&HSJ121_SendData[DataPOS],Mode,10);
-
- State=HSJ121_SendAndRecive(HSJ121_SendData,HSJ121_ReciveData);
-
- // 将模块回复的数据从HEX码转成Char
- HexToChar(HSJ121_ReciveData,(HSJ121_ReciveData[Length]+1));
-
- EXTI->IMR|=1<<13; //开13线上中断
- return State;
- }
- /******************************************/
- //函数原型: uint8_t HSJ121_Get_Config()
- //输入参数: 无
- //输出参数: 无
- //函数返回: TRUE or FALSE
- //功能描述: 获取配置信息
- /******************************************/
- uint8_t HSJ121_Get_Config(void)
- {
- uint8_t State;
- EXTI->IMR&=~(1<<13); //屏蔽13线上中断
-
- ClearData(HSJ121_SendData,HSJ121_SendDataLength); //清零发送数据
- ClearData(HSJ121_ReciveData,HSJ121_ReciveDataLength); //清零接收数据
-
- HSJ121_SendData[Length]=0x02; //添加数据长度
- HSJ121_SendData[CMD]=0x80; //添加命令码
-
- State=HSJ121_SendAndRecive(HSJ121_SendData,HSJ121_ReciveData);
-
- // 将模块回复的数据从HEX码转成Char
- HexToChar(HSJ121_ReciveData,(HSJ121_ReciveData[Length]+1));
-
- EXTI->IMR|=1<<13; //开13线上中断
- return State;
- }
- /******************************************/
- //函数原型: HSJ121_Get_Key(void)
- //输入参数: 无
- //输出参数: 无
- //函数返回: TRUE or FALSE
- //功能描述: 获取键值
- /******************************************/
- uint8_t HSJ121_Get_Key(void)
- {
- uint8_t num;
- uint8_t State;
- EXTI->IMR&=~(1<<13); //屏蔽13线上中断
-
- ClearData(HSJ121_SendData,HSJ121_SendDataLength); //清零发送数据
- ClearData(HSJ121_ReciveData,HSJ121_ReciveDataLength); //清零接收数据
-
- HSJ121_SendData[Length]=0x02; //添加数据长度
- HSJ121_SendData[CMD]=0xA0; //添加命令码
-
- for(num=0;num<3;num++)
- {
- State=HSJ121_SendAndRecive(HSJ121_SendData,HSJ121_ReciveData);
- if(State==TRUE){
- break;
- }
- }
-
- // 将模块回复的数据从HEX码转成Char
- HexToChar(HSJ121_ReciveData,(HSJ121_ReciveData[Length]+1));
-
- EXTI->IMR|=1<<13; //开13线上中断
- return State;
- }
- /******************************************/
- //函数原型: HSJ121_Set_ScanTime(uint8_t *ScanTme)
- //输入参数: *ScanTme 扫描时间
- //输出参数: 无
- //函数返回: TRUE or FALSE
- //功能描述: 设置扫描时间
- /******************************************/
- uint8_t HSJ121_Set_ScanTime(uint8_t *ScanTme) //设置按键扫描时间
- {
- uint8_t State;
- EXTI->IMR&=~(1<<13); //屏蔽13线上中断
-
- ClearData(HSJ121_SendData,HSJ121_SendDataLength); //清零发送数据
- ClearData(HSJ121_ReciveData,HSJ121_ReciveDataLength); //清零接收数据
-
- HSJ121_SendData[Length]=0x04; //添加数据长度
- HSJ121_SendData[CMD]=0x71; //添加命令码
- CopyData(&HSJ121_SendData[DataPOS],ScanTme,HSJ121_KeyScanTimeLength);
-
- State=HSJ121_SendAndRecive(HSJ121_SendData,HSJ121_ReciveData);
-
- // 将模块回复的数据从HEX码转成Char
- HexToChar(HSJ121_ReciveData,(HSJ121_ReciveData[Length]+1));
-
- EXTI->IMR|=1<<13; //开13线上中断
- return State;
- }
- /******************************************/
- //函数原型: HSJ121_Get_ScanTime(void)
- //输入参数: 无
- //输出参数: 无
- //函数返回: TRUE or FALSE
- //功能描述: 获取扫描时间
- /******************************************/
- uint8_t HSJ121_Get_ScanTime(void) //获取按键扫描时间
- {
- uint8_t State;
- EXTI->IMR&=~(1<<13); //屏蔽13线上中断
-
- ClearData(HSJ121_SendData,HSJ121_SendDataLength); //清零发送数据
- ClearData(HSJ121_ReciveData,HSJ121_ReciveDataLength); //清零接收数据
-
- HSJ121_SendData[Length]=0x02; //添加数据长度
- HSJ121_SendData[CMD]=0x81; //添加命令码
-
- State=HSJ121_SendAndRecive(HSJ121_SendData,HSJ121_ReciveData);
-
- // 将模块回复的数据从HEX码转成Char
- HexToChar(HSJ121_ReciveData,(HSJ121_ReciveData[Length]+1));
-
- EXTI->IMR|=1<<13; //开13线上中断
- return State;
- }
- /******************************************/
- //函数原型: HSJ121_Set_SleepMode(void)
- //输入参数: 无
- //输出参数: 无
- //函数返回: TRUE or FALSE
- //功能描述: 设置睡眠模式
- /******************************************/
- uint8_t HSJ121_Set_SleepMode(void)
- {
- uint8_t State;
- EXTI->IMR&=~(1<<13); //屏蔽13线上中断
-
- ClearData(HSJ121_SendData,HSJ121_SendDataLength); //清零发送数据
- ClearData(HSJ121_ReciveData,HSJ121_ReciveDataLength); //清零接收数据
-
- HSJ121_SendData[Length]=0x03; //添加数据长度
- HSJ121_SendData[CMD]=0x91; //添加命令码
- // HSJ121_SendData[DataPOS]=0x00; //关闭睡眠模式
- HSJ121_SendData[DataPOS]=0x01; //使能睡眠模式
-
- State=HSJ121_SendAndRecive(HSJ121_SendData,HSJ121_ReciveData);
-
- // 将模块回复的数据从HEX码转成Char
- HexToChar(HSJ121_ReciveData,(HSJ121_ReciveData[Length]+1));
-
- EXTI->IMR|=1<<13; //开13线上中断
- return State;
- }
- /******************************************/
- //函数原型: HSJ121_Into_SleepMode(void)
- //输入参数: 无
- //输出参数: 无
- //函数返回: TRUE or FALSE
- //功能描述: 进入睡眠模式
- /******************************************/
- uint8_t HSJ121_Into_SleepMode(void)
- {
- uint8_t State;
- EXTI->IMR&=~(1<<13); //屏蔽13线上中断
-
- ClearData(HSJ121_SendData,HSJ121_SendDataLength); //清零发送数据
- ClearData(HSJ121_ReciveData,HSJ121_ReciveDataLength); //清零接收数据
-
- HSJ121_SendData[Length]=0x02; //添加数据长度
- HSJ121_SendData[CMD]=0x90; //添加命令码
-
- State=HSJ121_SendAndRecive(HSJ121_SendData,HSJ121_ReciveData);
- // 将模块回复的数据从HEX码转成Char
- HexToChar(HSJ121_ReciveData,(HSJ121_ReciveData[Length]+1));
-
- EXTI->IMR|=1<<13; //开13线上中断
- return State;
- }
- /******************************************/
- //函数原型: HSJ121_WakeUp()
- //输入参数: 无
- //输出参数: 无
- //函数返回: TRUE or FALSE
- //功能描述: 唤醒芯片,进入工作模式
- /******************************************/
- uint8_t HSJ121_WakeUp(void)
- {
- uint8_t State;
- EXTI->IMR&=~(1<<13); //屏蔽13线上中断
-
- ClearData(HSJ121_SendData,HSJ121_SendDataLength); //清零发送数据
- ClearData(HSJ121_ReciveData,HSJ121_ReciveDataLength); //清零接收数据
-
- HSJ121_SendData[Length]=0x02; //添加数据长度
- HSJ121_SendData[CMD]=0xA6; //添加命令码
- State=HSJ121_SendAndRecive(HSJ121_SendData,HSJ121_ReciveData);
-
- // 将模块回复的数据从HEX码转成Char
- HexToChar(HSJ121_ReciveData,(HSJ121_ReciveData[Length]+1));
-
- EXTI->IMR|=1<<13; //开13线上中断
- return State;
- }
-
复制代码
- //////////////////////////////////////////////////////////////////////////////////
- //本程序只供测试使用,不能用作产品代码
- //////////////////////////////////////////////////////////////////////////////////
- /* 包含的头文件 --------------------------------------------------------------*/
- #include "bsp.h"
- #include "i2c.h"
- #include "timer.h"
- #include "usart.h"
- #include "aboutdata.h"
- #include "HSJ121.h"
- /************************************************
- 函数名称 : System_Initializes
- 功 能 : 系统初始化
- 参 数 : 无
- 返 回 值 : 无
- 作 者 :
- *************************************************/
- void System_Initializes(void)
- {
- BSP_Initializes(); //底层初始化
- TIMER_Initializes(); //TIMER初始化
- USART_Initializes(); //串口1初始化
- }
- /************************************************
- 函数名称 : main
- 功 能 : 主函数入口
- 参 数 : 无
- 返 回 值 : int
- 作 者 :
- *************************************************/
- int main(void)
- {
- System_Initializes(); //系统初始化
- HSJ121Init(); //芯片初始化
- //所有命令都必须在唤醒成功的状态下执行
- //---------------------芯片唤醒-------------------------//
- #if HSJ_WakeUp_en
- if(HSJ121_WakeUp()==TRUE){
- printf("Wake Up Success\n");
- USART1_PrintfNChar(CharData,strlen(CharData));
- //-----------------------------------------------------//
- //---------------------低速扫描模式---------------------//
- #if HSJ_LowScanMode_en
- if(HSJ121_Set_LowScanMode(HSJ121_Mode_LowScan)==TRUE){
- printf("Set Low Scan Mode Success\n");
- USART1_PrintfNChar(CharData,strlen(CharData));
- }else{
- printf("Set Low Scan Mode Fail\n");
- USART1_PrintfNChar(CharData,strlen(CharData));
- }
- #endif
- //---------------------接近感应模式---------------------//
- #if HSJ_NearInductionMode_en
- if(HSJ121_Set_NearInductionMode(HSJ121_Mode_NearInduction)==TRUE){
- printf("Set Near Induction Mode Success\n");
- USART1_PrintfNChar(CharData,strlen(CharData));
- }else{
- printf("Set Near Induction Mode Fail\n");
- USART1_PrintfNChar(CharData,strlen(CharData));
- }
- #endif
- //---------------------获取配置-------------------------//
- #if HSJ_GetConfig_en
- if(HSJ121_Get_Config()==TRUE){
- printf("Get Config Success\n");
- USART1_PrintfNChar(CharData,strlen(CharData));
- }else{
- printf("Get Config Fail\n");
- USART1_PrintfNChar(CharData,strlen(CharData));
- }
- #endif
- //---------------------设置扫描时间----------------------//
- #if HSJ_SetScanTime_en
- if(HSJ121_Set_ScanTime(HSJ121_KeyScanTime)==TRUE){
- printf("Set Scan Time Success\n");
- USART1_PrintfNChar(CharData,strlen(CharData));
- }else{
- printf("Set Scan Time Fail\n");
- USART1_PrintfNChar(CharData,strlen(CharData));
- }
- #endif
- //---------------------获取扫描时间----------------------//
- #if HSJ_GetScanTime_en
- if(HSJ121_Get_ScanTime()==TRUE){
- printf("Get Scan Time Success\n");
- USART1_PrintfNChar(CharData,strlen(CharData));
- }else{
- printf("Get Scan Time Fail\n");
- USART1_PrintfNChar(CharData,strlen(CharData));
- }
- #endif
- //---------------------设置睡眠模式----------------------//
- #if HSj_SetSleepMode_en
- if(HSJ121_Set_SleepMode()==TRUE){
- printf("Set Sleep Mode Success\n");
- USART1_PrintfNChar(CharData,strlen(CharData));
- }else{
- printf("Set Sleep Mode Fail\n");
- USART1_PrintfNChar(CharData,strlen(CharData));
- }
- #endif
- //---------------------进入睡眠模式---------------------//
- #if HSJ_IntoSleepMode_en
- if(HSJ121_Into_SleepMode()==TRUE){
- printf("Into Sleep Mode Success\n");
- USART1_PrintfNChar(CharData,strlen(CharData));
- }else{
- printf("Into Sleep Mode Fail\n");
- USART1_PrintfNChar(CharData,strlen(CharData));
- }
- #endif
- //-----------------------------------------------------//
- }else{
- printf("Wake Up Fail\n");
- USART1_PrintfNChar(CharData,strlen(CharData));
- }
- #endif
-
- while(1);
- }
- /******************************* end ************************************/
复制代码
所有资料51hei提供下载:
HSJ121-STM32F103RCT6.7z
(391.06 KB, 下载次数: 15)
|
评分
-
查看全部评分
|