⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bum.asm

📁 蓝牙设备中HCI语言传输数据
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;  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 + -