📄 bum.asm
字号:
; Length = r0;--------------------HCI_Page_Scan_Mode_Event: lcall Throw_Away_HCI_Event_Parameter ret;------------------------;呼叫扫描轮询模式改变事件;EventCode=20H;入口参数:; Length = r0;------------------------Page_Scan_Repetition_Mode_Change_Event: lcall Throw_Away_HCI_Event_Parameter ret;-------------------------;接收来自BC01的ACL数据分组;BC01缓冲区中的内容:;Connection_Handle|PB|BC 2;ACL_Total_Length 2;Data_Payload N;-------------------------HCI_ACL_Data_Receive: mov r0,#02h lcall Throw_Away_HCI_Event_Parameter cjne r7,#00h,HCI_ACL_R_LOST mov R0,#80h ;Connection_Handle -> (R2,R1) mov a,@r0 mov r1,a ;Connection_Handle(低八位)->R1 inc r0 mov a,@r0 anl a,#0fh mov r2,a ;Connection_Handle(高八位)->R2 mov a,@r0 ;PB标志 anl a,#30h rr a rr a rr a rr a mov r3,a ;PB标志->R3 mov r0,#0ffh ;ACL_Total_Length = (R5,R4) lcall BC01_GetByte cjne r6,#00h,HCI_ACL_R_LOST mov a,r7 mov r4,a ;ACL_Total_Length(低八位)->R4 mov r0,#0ffh lcall BC01_GetByte cjne r6,#00h,HCI_ACL_R_LOST mov a,r7 mov r5,a ;ACL_Total_Length(高八位)->R5 cjne r3,#01h,ACL_R_First ;用于高层报文的数据分组分段 mov a,r1 ;Connection_Handle = (R1,R0) mov r0,a mov a,r2 mov r1,a mov a,r3 ;Flag = R2 mov r2,a mov a,r4 ;Length =R3 mov r3,a lcall BUM_Data_Receive retACL_R_First: ;高层报文的第一个数据分组 mov a,r1 ;Connection_Handle = (R1,R0) mov r0,a mov a,r2 mov r1,a mov a,r3 ;Flag = R2 mov r2,a mov a,r4 ;Length =R4 mov r3,a lcall BUM_Data_Receive retHCI_ACL_R_LOST: ret;----------------------------------;发送ACL数据分组到BC01;入口参数:; Connection_Handle = (r1,r0); PB = r2; BC = r3; Length = r4; Data_Payload = BUM中断缓冲区;----------------------------------HCI_ACL_Data_Transmit: push acc mov a,r5 push acc mov a,#02 lcall BC01_PutByte mov a,r3 ;处理BC mov r5,#06h ;移动次数MoveBC6Times: rl a ;BC向左移 djnz r5,MoveBC6Times orl a,r1 ;BC加入Connection_Handle mov r1,a mov a,r2 ;处理PB mov r5,#04h ;移动次数MovePB4Times: rl a djnz r5,MovePB4Times orl a,r1 ;加入PB mov r1,a mov a,r0 lcall BC01_PutByte mov a,r1 lcall BC01_PutByte;发送链接句柄 mov a,r4 lcall BC01_putByte mov a,#00h lcall BC01_PutByte;数据长度HCI_Start_Data_Transmit: lcall BUM_GetByte mov a,r7 lcall BC01_PutByte djnz r4,HCI_Start_Data_Transmit pop acc mov r5,a pop acc ret;--------------------------------------------------------------------------;Bluetooth Universal Module 功能处理模块;--------------------------------------------------------------------------;--------------------------;读出BUM中断缓冲区中的内容;入口参数:; Read_Length = R0;返回参数:; Status = R7 (==00H:成功); (!=00H:失败);--------------------------Throw_Away_BUM_Parameter: push acc push psw push b mov a,r1 push acc mov a,r0 ;循环次数 -> A mov r1,#80h ;存放参数的首地址 -> R1TABUMP_Continue: jz TABUMP_SUCCESS ;取完数,返回成功 dec a ;循环次数减一 mov r0,#0ffh lcall BUM_GetByte ;取出一个字节 cjne r6,#00h,TABUMP_FAILE mov b,r7 mov @r1,b ;保存读出的字节 inc r1 sjmp TABUMP_ContinueTABUMP_SUCCESS: mov r7,#00h pop acc mov r1,a pop b pop psw pop acc retTABUMP_FAILE: mov r7,#0ffh pop acc mov r1,a pop b pop psw pop acc ret;--------------------;单片机处理接收的指令;--------------------BUM_Dispose: mov r0,#00h lcall BUM_GetByte ;从缓冲区中取出一个字节 cjne r6,#00h,OutDispose ;如果R6不为00H说明读数据失败,则跳出 ;否则说明读取帧头成功,数据存放在R7中 cjne r7,#0ch,LostDispose ;如果R7中不为0CH则主机包错误 mov r0,#0ffh lcall BUM_GetByte cjne r6,#00h,lostDispose ;读取分组类型失败 ;说明读取分组类型成功,且存放在R7中 cjne r7,#01h,DataDispose ;继续判断分组类型 ;分组类型为命令分组 lcall BUM_Command sjmp OutDisposeDataDispose: cjne r7,#02h,NoDataDispose;分组类型不是数据分组 lcall BUM_Data sjmp OutDisposeNoDataDispose: lcall BUM_SET_BUF;清缓冲区 mov r0,#06h ;发送指令非法事件 mov r1,#00h lcall BUM_Status_Event retLostDispose: lcall Delay5ms lcall BUM_SET_BUF ;清缓冲区 mov r1,#1dh mov r2,#00h lcall BUM_Status_Event;调用发送报告主机包错误指令OutDispose: ;缓冲区空,直接返回 ret;------------------;单片机接收的是命令;------------------BUM_Command: mov r0,#0FFh lcall BUM_GetByte ;Length -> R7 cjne r6,#00h,BUM_CommandDisposeFail ;读数据失败则跳转 cjne r7,#00h,ContinueCommandDispose ;长度不为零,处理命令BUM_CommandDisposeFail: ;长度为零,分组错误 lcall Delay5ms lcall BUM_SET_BUF mov r0,#1dh ;发送未知操作码的主机包错误事件 mov r1,#00h lcall BUM_Status_Event retContinueCommandDispose: mov a,r7 ;Length -> A push acc ;保存长度 mov r5,a ;Length -> R5 mov r0,a ;入口参数 lcall Throw_Away_BUM_Parameter;读了BUM中断缓冲区中的内容放到80H开始的单元 cjne r7,#00h,BUM_CommandDisposeFail;包丢失,跳至CommandDisposeFail pop acc ;从堆栈中恢复长度 mov r5,a mov r0,#0FFh lcall BUM_GetByte ;取出LSB cjne r6,#00h,BUM_CommandDisposeFail ;分组丢失,跳至CommandDisposeFail cjne r7,#0ch,BUM_CommandDisposeFail ;分组错误,跳至CommandDisposeFail mov r0,#80h mov a,@r0 ;OpCode -> A cjne a,#01h,BUM_C_NEXT1 ;不是复位指令则继续 lcall BUM_Reset retBUM_C_NEXT1: cjne a,#02h,BUM_C_NEXT2 ;不是初始化蓝牙为从设备指令则继续 lcall BUM_Init_As_Slave retBUM_C_NEXT2: cjne a,#03h,BUM_C_NEXT3 ;不是初始化蓝牙为主设备指令则继续 mov r0,#00h mov r1,#03h lcall BUM_Status_Event ;发送命令状态事件 lcall BUM_Init_As_Master retBUM_C_NEXT3: cjne a,#04h,BUM_C_NEXT4 ;不是获得蓝牙设备地址指令则继续 lcall BUM_Read_ADDR retBUM_C_NEXT4: cjne a,#05h,BUM_C_NEXT5 ;不是建立数据连接指令则继续 mov r0,#00h mov r1,#05h lcall BUM_Status_Event ;发送命令状态事件 mov r0,#81h ;1 mov a,@r0 push acc inc r0 ;2 mov a,@r0 mov r1,a inc r0 ;3 mov a,@r0 mov r2,a inc r0 ;4 mov a,@r0 mov r3,a inc r0 ;5 mov a,@r0 mov r4,a inc r0 ;6 mov a,@r0 mov r5,a ;ADDR作为入口参数 pop acc mov r0,a lcall BUM_Create_DataConnection retBUM_C_NEXT5: cjne a,#06h,BUM_C_NEXT6 ;不是断开数据连接指令则继续 mov r0,#00h mov r1,#06h lcall BUM_Status_Event ;发送命令状态事件 mov r0,#81h ;Connection_Handle(High) mov a,@r0 mov r0,a mov r1,#82h mov a,@r1 mov r1,a ;数据连接句柄作为入口参数 lcall BUM_Disconnect_DataConnection retBUM_C_NEXT6: cjne a,#07h,BUM_C_NEXT7 ;不是进入Sleep模式指令则继续 mov r0,#81h ;Role作为入口参数 mov a,@r0 mov r0,a mov r1,#83h ;数据连接句柄作为入口参数 mov a,@r1 mov r2,a mov r1,#82h mov a,@r1 mov r1,a lcall BUM_Sleep retBUM_C_NEXT7: cjne a,#08h,BUM_C_CommandCodeEorr;不是唤醒指令则继续 mov r0,#81h ;Role作为入口参数 mov a,@r0 mov r0,a mov r1,#83h ;数据连接句柄作为入口参数 mov a,@r1 mov r2,a mov r1,#82h mov a,@r1 mov r1,a lcall BUM_WakeUp retBUM_C_CommandCodeEorr: lcall BUM_SET_BUF mov r0,#06h mov r1,#00h lcall BUM_Status_Event ret;------------------;单片机节收的是数据;------------------BUM_Data: push acc push b lcall BUM_GetByte cjne r7,#00h,Continue_BUM_Data1 lcall BUM_Hardware_Error_Event pop b pop acc retContinue_BUM_Data1: clr c mov a,r7 subb a,#02h ;数据长度 -> B cjne a,#00h,Continue_BUM_Data2 lcall BUM_Hardware_Error_Event pop b pop acc retContinue_BUM_Data2: push acc lcall BUM_GetByte mov a,r7 mov r5,a ;链接句柄 -> (R6,R5) lcall BUM_GetByte mov a,r7 mov r6,a pop b mov r7,b ;Length -> R7 cjne r7,#7Fh,Continue_BUM_Data_Dispose1 ;长度不等于7F则跳转 sjmp LessThan7FContinue_BUM_Data_Dispose1: jc LessThan7F ;长度小于7F则跳转 ;长度大于7F mov a,r5 ;Connection_Handle = (R1,R0) mov r0,a mov a,r6 mov r1,a mov r2,#02h ;PB =10B mov r3,#00h ;BC =00B mov r4,#7fh ;Length = 7FH lcall HCI_ACL_Data_Transmit clr c mov a,r7 subb a,#7Fh mov r4,a ;Length = (R7) - 7fh mov a,r5 ;Connection_Handle = (R1,R0) mov r0,a mov a,r6 mov r1,a mov r2,#01h ;PB =10B mov r3,#00h ;BC =00B lcall HCI_ACL_Data_Transmit pop b pop acc retLessThan7F: mov a,r5 ;Connection_Handle = (R1,R0) mov r0,a mov a,r6 mov r1,a mov r2,#02h ;PB =10B mov r3,#00h ;BC =00B mov a,r7 mov r4,a lcall HCI_ACL_Data_Transmit pop b pop acc ret;--------------------------------------------------------------------------;公共函数区;--------------------------------------------------------------------------;--------------------------;延时5ms;--------------------------Delay5ms: mov a,r1 ;-1 保护现场 push acc ;-2 mov a,r0 ;-1 push acc ;-2 push psw ;-2 mov r1,#18 ;-1 (9)Sloop2: ; |------- mov r0,#255 ;-1 |Sloop: ; |---| djnz r0,Sloop ;-2 |500| djnz r1,Sloop2 ;-2 |503*18=(9054) pop psw ;-2 (10) pop acc ;-2 mov r0,a ;-1 pop acc ;-2 mov r1,a ;-1 ret ;-2;--------;清空内存;--------ClearMemory: clr ea push psw ;PSW,ACC,R0 push acc mov a,r0 push acc mov dptr,#SP0_WL ;开始地址 mov a,#00hContinueCM: mov a,#00h movx @dptr,a movx a,@dptr inc dptr mov r0,dpl cjne r0,#SP1_BL,ContinueCM mov r0,dph cjne r0,#SP1_BH,ContinueCM pop acc ;R0,ACC,PSW mov r0,a pop acc pop psw setb ea ret;--------------------------;设置BC01串行中断接收缓冲区;--------------------------BC01_SET_BUF: push acc push b mov a,#SP0_LL ;顶部指针低八位->A mov b,#SP0_LH ;顶部指针高八位->B mov dptr,#SP0_WL ;修改写指针低八位(A) movx @dptr,a mov dptr,#SP0_RL ;修改读指针低八位(A) movx @dptr,a mov a,b mov dptr,#SP0_WH ;修改写指针高八位(B) movx @dptr,a mov dptr,#SP0_RH ;修改读指针高八位(B) movx @dptr,a pop b pop acc ret;-------------------------;设置BUM串行中断接收缓冲区;-------------------------BUM_SET_BUF: push acc push b mov a,#SP1_LL ;顶部指针低八位->A mov b,#SP1_LH ;顶部指针高八位->B mov dptr,#SP1_WL ;修改写指针低八位(A) movx @dptr,a mov dptr,#SP1_RL ;修改读指针低八位(A) movx @dptr,a mov a,b mov dptr,#SP1_WH ;修改写指针高八位(B) movx @dptr,a mov dptr,#SP1_RH ;修改读指针高八位(B) movx @dptr,a pop b pop acc ret;-------------------;打开串口(P3.0/P3.1);-------------------OpenBC01: clr es ;关闭串行中断 mov T2CON,#30h ;RCLK=1,强制使用定时器2作为接收的波特率发生器
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -