📄 bum.asm
字号:
;====================;Serial Port 0 Define;====================SP0_CTS BIT P1.6SP0_RTS BIT P1.7;====================;Serial Port 1 Define;====================SP1_CTS BIT p1.5SP1_RTS BIT p1.4STATUS EQU 0C5HWDCON EQU 0D8HSCON1 EQU 0C0HRI_1 BIT SCON1.0TI_1 BIT SCON1.1SBUF1 EQU 0C1HES1 BIT ie.6PS1 BIT ip.6;==============;Timer 2 Define;==============TA EQU 0C7H;ET2 BIT 0ADH;T2CON EQU 0C8HTR2 BIT T2CON.2T2MOD EQU 0C9H;RCAP2L EQU 0CAH;RCAP2H EQU 0CBH;TL2 EQU 0CCH;TH2 EQU 0CDH;=========================;Power Management Register;=========================PMR EQU 0C4H;-------------------;Data Pointer Select;-------------------DPS EQU 86H;=================================;Serial Port Receive Buffer Define;---------------------------------;BlueCore 01 Receive Buffer;=================================SP0_WL EQU 0000HSP0_WH EQU 0001HSP0_RL EQU 0002HSP0_RH EQU 0003HSP0_LL EQU 04H ;0004HSP0_LH EQU 00HSP0_BL EQU 00H ;0200HSP0_BH EQU 02H;=========================================;Bluetooth Universal Module Receive Buffer;=========================================SP1_WL EQU 0200HSP1_WH EQU 0201HSP1_RL EQU 0202HSP1_RH EQU 0203HSP1_LL EQU 04H ;0204HSP1_LH EQU 02HSP1_BL EQU 00H ;0400HSP1_BH EQU 04H;========; ******;========ORG 0000H ljmp BUM_MainORG 0003H ;Extermal Interrupt 0 retiORG 000BH ;Timer 0 Overflow retiORG 0013H ;Extermal Interrupt 1 retiORG 001BH ;Timer 1 Overflow retiORG 0023H ;Serial Port lcall BC01_INT retiORG 002BH ;Timer 2 Interrupt retiORG 003BH ;Serial Port 1 lcall BUM_INT retiORG 0043H ;Extermal Interrupt 2 retiORG 004BH ;Extermal Interrupt 3 retiORG 0053H ;Extermal Interrupt 4 retiORG 005BH ;Extermal Interrupt 5 retiORG 0063H ;Watchdog Timer reti;========ORG 0070HBUM_Main: mov ie,#00h mov ip,#00h mov psw,#00h ;PSW置0 mov DPS,#00h mov TA,#0aah mov TA,#55h mov tcon,#00h ;复位定时器控制寄存器 mov T2CON,#00h mov sp,#37h ;设置堆栈指针 setb ea ;允许总中断 xrl PMR,#01h lcall ClearMemory lcall BC01_SET_BUF lcall OpenBC01 lcall BUM_SET_BUF lcall OpenBUM ;mov a,#0aah ;lcall BUM_PutByte ;mov a,#0aah ;lcall BC01_PutByte ;lcall BUM_Reset ;lcall Delay5ms ;lcall BC01_Dispose ;lcall BUM_Init_As_Slave ;lcall Delay5ms ;lcall BC01_Dispose ;lcall BUM_Init_As_Master ;lcall Delay5ms ;lcall BUM_Read_ADDR ;lcall Delay5ms ;mov r0,#0eah ;ADDR ;mov r1,#42h ;mov r2,#00h ;mov r3,#5bh ;mov r4,#02h ;mov r5,#00h ;lcall BUM_Create_DataConnection ;lcall Delay5ms ;mov r0,#22h ;DC_Handle ;mov r1,#11h ;lcall BUM_Disconnect_DataConnection ;lcall Delay5ms ;------------------------------------------------------------------------------- ;处理HCI事件和数据分组 ;-------------------------------------------------------------------------------here: lcall BC01_Dispose lcall BUM_Dispose sjmp here;---------------------------------------------------------------------------------;BlueCore01功能处理模块;---------------------------------------------------------------------------------;-----------------------;BlueCore01的HCI分组处理;-----------------------BC01_Dispose: mov r0,#00h lcall BC01_GetByte cjne r6,#0FFh,BC01_HCI_Event_Dispose ;读数据成功,则跳转到处理 ret ;缓冲区为空则返回BC01_HCI_Event_Dispose: cjne r7,#04h,BC01_HCI_ACL_Dispose ;判断是否是事件指示器,不是则从头开始 lcall Delay5ms lcall Delay5ms mov r0,#0ffh lcall BC01_GetByte ;是事件指示器,取出下一个字节判断事件类型 cjne r6,#00h,HCI_Event_Lost push acc mov a,r7 mov r0,a pop acc lcall HCI_Event_Type retBC01_HCI_ACL_Dispose: cjne r7,#02,BC01_HCI_Other lcall HCI_ACL_Data_Receive retBC01_HCI_Other: ;错误的分组类型 ;延时5ms,清除中断接收缓冲区 lcall Delay5ms lcall BC01_SET_BUF ;通知主机 mov r0,#1dh ;Status = 1DH(未特别指明的错误) mov r1,#00h ;OpCode = 00h lcall BUM_Status_Event retHCI_Event_Lost: ;事件分组丢失 ;延时5ms,清除中断接收缓冲区 lcall Delay5ms lcall BC01_SET_BUF ;通知主机 mov r0,#0ffh ;Hardware_Code = R0 lcall BUM_Hardware_Error_Event ret;-----------------;判断HCI事件类型;入口参数:; Event_Type = R0;-----------------HCI_Event_Type: push acc mov a,r0 mov r1,a ;事件分组类型->R1 mov r0,#0ffh lcall BC01_GetByte ;取出事件分组参数长度 cjne r6,#00h,HCI_Event_Length_Lost mov a,r7 mov r0,a ;事件分组参数长度->R0 pop acc cjne r1,#0eh,Next1 lcall HCI_Command_Complete_Event ;调用命令完成事件 ret Next1: cjne r1,#0fh,Next2 lcall HCI_Command_Status_Event ;调用命令状态事件 ret Next2: cjne r1,#02h,Next3 lcall HCI_Inquiry_Result_Event ;调用查询结果事件 ret Next3: cjne r1,#01h,Next4 lcall HCI_Inquiry_Complete_Event ;调用查询完成事件 ret Next4: cjne r1,#03h,Next5 lcall HCI_Connection_Complete_Event ;调用链接完成事件 ret Next5: cjne r1,#1bh,Next6 lcall HCI_Max_Slots_Change_Event ;调用最大时隙改变事件 ret Next6: cjne r1,#10h,Next7 lcall HCI_Hardware_Error_Event ;调用硬件错误事件 ret Next7: cjne r1,#05h,CaseElse lcall HCI_Disconnect_Complete_Event ;调用断开链接完成事件 ret CaseElse: lcall Throw_Away_HCI_Event_Parameter ;其他HCI事件分组,读出缓冲区内容 retHCI_Event_Length_Lost: lcall Delay5ms lcall BC01_Set_BUF mov r0,#0ffh ;Hardware_Code = R0 lcall BUM_Hardware_Error_Event ret;--------------------------;读出中断缓冲区中的内容;入口参数:; Read_Length = R0;返回参数:; Status = R7 (==00H:成功); (!=00H:失败);--------------------------Throw_Away_HCI_Event_Parameter: push acc push psw push b mov a,r1 push acc mov a,r0 ;循环次数 -> A mov r1,#80h ;存放参数的首地址 -> R1TAHCIEP_Continue: jz TAHCIEP_SUCCESS ;取完数,返回成功 dec a ;循环次数减一 mov r0,#0ffh lcall BC01_GetByte ;取出一个字节 cjne r6,#00h,TAHCIEP_FAILE mov b,r7 mov @r1,b ;保存读出的字节 inc r1 sjmp TAHCIEP_ContinueTAHCIEP_SUCCESS: mov r7,#00h pop acc mov r1,a pop b pop psw pop acc retTAHCIEP_FAILE: mov r7,#0ffh pop acc mov r1,a pop b pop psw pop acc ret;-------------;查询完成事件;EventCode=01H;入口参数:; Length = r0;-------------HCI_Inquiry_Complete_Event: mov a,r0 ;参数长度->A mov r0,#0ffh lcall BC01_GetByte ;Status -> R7 cjne r6,#00h,HCIICE_Lost dec a mov r0,a ;Length->R0 mov a,r7 ;Status->A lcall Throw_Away_HCI_Event_Parameter cjne r7,#00,HCIICE_Lost jnz HCIICE_FAIL mov r0,#80h mov a,#00h mov @r0,a ;Status = 00H (成功) mov r0,#03h ;Opcode = 03H (BUM_Init_As_Master) mov r1,#01h ;Length lcall BUM_Complete_Event retHCIICE_FAIL: mov r0,#80h mov a,#1dh mov @r0,a ;Status = 1DH (失败) mov r0,#03h ;Opcode = 03H (BUM_Init_As_Master) mov r1,#01h ;Lenght lcall BUM_Complete_Event retHCIICE_Lost: mov r0,#0ffh ;Hardware_Code = R0 lcall BUM_Hardware_Error_Event ret;-------------;查询结果事件;EventCode=02H;入口参数:; Length = r0;-------------HCI_Inquiry_Result_Event: mov a,r0 ;参数长度 -> A mov r0,#0ffh lcall BC01_GetByte ;读Num cjne r6,#00h,HCIIRE_Lost ;读出Num成功 mov a,r7 ;Num -> ASend_BUM_Init_As_Master_Result_Event: jz HCIIRE_SUCCESS dec a ;Num = Num -1 push acc ;A -> STACK mov r0,#0eh ;Length->R0(14字节) lcall Throw_Away_HCI_Event_Parameter cjne r7,#00,HCIIRE_Lost mov r0,#01h ;Num = 01H lcall BUM_Init_As_Master_Result_Event pop acc ;STACK -> A sjmp Send_BUM_Init_As_Master_Result_EventHCIIRE_SUCCESS: retHCIIRE_FAIL: mov r0,#80h mov a,#1dh mov @r0,a ;Status = 1dH mov r0,#03h ;Opcode = 03H (BUM_Init_As_Master) mov r1,#01h ;Length lcall BUM_Complete_Event retHCIIRE_Lost: mov r0,#0ffh ;Hardware_Code = R0 lcall BUM_Hardware_Error_Event ret;-------------;连接完成事件;EventCode=03H;入口参数:; Length = r0;-------------HCI_Connection_Complete_Event: lcall Throw_Away_HCI_Event_Parameter cjne r7,#00,HCICCE_Lost ;分组丢失 ;处理连接完成事件 mov r0,#80h mov a,@r0 ;Status -> A cjne a,#00h,HCICCE_FAIL ;连接失败? ;连接成功 mov r0,#89h ;Link_Type -> A mov a,@r0 cjne a,#00h,Create_ACL_SUCCESSCreate_SCO_SUCCESS: ;SCO连接建立成功 retCreate_ACL_SUCCESS: ;ACL连接建立成功 mov r0,#81h ;Connection_Handle = (R2,R1) mov a,@r0 mov r1,a push acc ;Push R1 inc r0 mov a,@r0 mov r2,a push acc ;Push R2 mov r0,#83h ;ADDR = 80h -> 85h mov a,@r0 mov r0,#80h mov @r0,a mov r0,#84h ;1 mov a,@r0 mov r0,#81h mov @r0,a mov r0,#85h ;2 mov a,@r0 mov r0,#82h mov @r0,a mov r0,#86h ;3 mov a,@r0 mov r0,#83h mov @r0,a mov r0,#87h ;4 mov a,@r0 mov r0,#84h mov @r0,a mov r0,#88h ;5 mov a,@r0 mov r0,#85h mov @r0,a mov r0,#00h ;Status = 00H(SUCCESS) lcall BUM_DataConnection_Complete_Event pop acc ;Connection_Handle = (R1,R0) mov r1,a pop acc mov r0,a mov r2,#08h ;Link_Policy_Setting = (R3,R2)[0008H][Park] mov r3,#00h lcall HCI_Write_Link_Policy_Settings retHCICCE_FAIL: mov r0,#89h ;Link_Type -> A mov a,@r0 cjne a,#00h,Create_ACL_FAILCreate_SCO_FAIL: ;SCO连接建立失败 retCreate_ACL_FAIL: mov r0,#80h mov a,@r0 mov r0,a ;Status = A(FAIL) mov r1,#00h ;Connection_Handle = (R2,R1) mov r2,#00h lcall BUM_DataConnection_Complete_Event retHCICCE_Lost: mov r0,#0ffh ;Hardware_Code = R0 lcall BUM_Hardware_Error_Event ret;-------------;连接请求事件;EventCode=04H;入口参数:; Length = r0;-------------HCI_Connection_Request_Event: lcall Throw_Away_HCI_Event_Parameter ret;----------------;断开连接完成事件;EventCode=05H;入口参数:; Length = r0;----------------HCI_DisConnect_Complete_Event: lcall Throw_Away_HCI_Event_Parameter cjne r7,#00,HCIDCE_Lost mov r0,#81h mov a,@r0 mov r1,a ;DC_Handle = (R2,R1) inc r0 mov a,@r0 mov r2,a ;R2 inc r0 mov a,@r0 mov r3,a ;Reason =R3 mov r0,#80h mov a,@r0 mov r0,a ;Status = R0 lcall BUM_Disconnect_Complete_Event retHCIDCE_Lost: mov r0,#0ffh lcall BUM_Hardware_Error_Event ret;-------------;认证完成事件;EventCode=06H;入口参数:; Length = r0;-------------HCI_Authentication_Complete_Event: lcall Throw_Away_HCI_Event_Parameter ret;--------------------;远程命名请求完成事件;EventCode=07H;入口参数:; Length = r0;--------------------HCI_Remote_Name_Request_Complete_Event: lcall Throw_Away_HCI_Event_Parameter ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -