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

📄 bum.asm

📁 蓝牙设备中HCI语言传输数据
💻 ASM
📖 第 1 页 / 共 5 页
字号:
                        ;TCLK=1,强制使用定时器2作为发送的波特率发生器    mov T2MOD,#04h      ;定时器2正向溢出(加)    mov TH2,#0FFh       ;波特率: 115200 bps, 晶振: 22.1184 MHz    mov TL2,#0FAh    mov RCAP2H,#0FFH    mov RCAP2L,#0FAH    setb TR2            ;定时器2开始定时    mov pcon,#00h       ;波特率倍增    mov scon,#50h       ;串口工作在方式1: 8位数据位,1位停止位,无较验    clr SP0_CTS    clr SP0_RTS    setb ps             ;串行中断最高优先级    setb es             ;开串行中断    ret;-------------------;打开串口(P1.2/P1.3);-------------------OpenBUM:    clr ES1             ;关闭串行中断1    mov tcon,#00h    mov tmod,#20h       ;定时器1工作在方式2,自动加载计数初值    mov th1,#0ffh       ;波特率: 115200 bps, 晶振: 22.1184 MHz    mov tl1,#0ffh    setb tr1            ;定时器1开始定时    mov WDCON,#80h      ;波特率倍增    mov SCON1,#50h      ;串口1工作在方式1: 8位数据位,1位停止位,无较验    clr SP1_CTS    clr SP1_RTS    setb PS1            ;串行中断最高优先级    setb ES1            ;开串行中断1    ret;-------------------------;BlueCore01 中断接收子程序;-------------------------;SP0_WL	  写指针低八位地址;SP0_WH	  写指针高八位地址;SP0_RL	  读指针低八位地址;SP0_RH	  读指针高八位地址;(SP0_LH,SP0_LL);...        中断接收缓冲区;(SP0_BH,SP0_BL)-1;-------------------------BC01_INT:        jb ri,BC01_GET         ;为发送中断,直接返回        retiBC01_GET:	clr es	clr ea	push psw               ;PSW,ACC,B,DPL,DPH	push acc	push b	push dpl	push dph	setb ea        mov dptr,#SP0_WL       ;取出写指针放入DPTR中	movx a,@dptr	mov b,a                ;低八位->B	mov dptr,#SP0_WH	movx a,@dptr           ;高八位->A	mov dpl,b              ;B->DPL	mov dph,a              ;A->DPH	mov a,sbuf             ;读出数据->A        movx @dptr,a           ;保存数据到缓冲区	inc dptr               ;写指针下移	mov a,dph	cjne a,#SP0_BH,SP0_False       ;比较写指针是否指向缓冲区底部        mov dpl,#SP0_LL        ;是,修改写指针指向缓冲区顶部        mov dph,#SP0_LHSP0_False:        mov b,dph              ;DPH->B        mov a,dpl              ;DPL->A	mov dptr,#SP0_WL       ;修改写指针低八位	movx @dptr,a	mov dptr,#SP0_WH       ;修改写指针高八位	mov a,b	movx @dptr,a        clr ri                 ;清接收标志位        clr ea	pop dph                ;DPH,DPL,B,ACC,PSW	pop dpl	pop b	pop acc	pop psw	setb ea	setb es	reti;-------------------------;BUM 中断接收子程序;-------------------------;SP1_WL	  写指针低八位地址;SP1_WH	  写指针高八位地址;SP1_RL	  读指针低八位地址;SP1_RH	  读指针高八位地址;(SP1_LH,SP1_LL);...        中断接收缓冲区;(SP1_BH,SP1_BL)-1;-------------------------BUM_INT:        jb RI_1,BUM_GET        ;为发送中断,直接返回        retiBUM_GET:	clr ES1	clr ea	push psw               ;PSW,ACC,B,DPL,DPH	push acc	push b	push dpl	push dph	setb ea        mov dptr,#SP1_WL       ;取出写指针放入DPTR中	movx a,@dptr	mov b,a                ;低八位->B	mov dptr,#SP1_WH	movx a,@dptr           ;高八位->A	mov dpl,b              ;B->DPL	mov dph,a              ;A->DPH	mov a,SBUF1            ;读出数据->A        movx @dptr,a           ;保存数据到缓冲区	inc dptr               ;写指针下移	mov a,dph	cjne a,#SP1_BH,SP1_False       ;比较写指针是否指向缓冲区底部        mov dpl,#SP1_LL        ;是,修改写指针指向缓冲区顶部        mov dph,#SP1_LHSP1_False:        mov b,dph              ;DPH->B        mov a,dpl              ;DPL->A	mov dptr,#SP1_WL       ;修改写指针低八位	movx @dptr,a	mov dptr,#SP1_WH       ;修改写指针高八位	mov a,b	movx @dptr,a        clr RI_1               ;清接收标志位        clr ea	pop dph                ;DPH,DPL,B,ACC,PSW	pop dpl	pop b	pop acc	pop psw	setb ea	setb ES1	reti;---------------------;将A中的内容发送到BC01;---------------------BC01_PutByte:        clr ti        mov sbuf,a        jnb ti,$        clr ti        ret;--------------------;将A中的内容发送到BUM;--------------------BUM_PutByte:        clr TI_1        mov SBUF1,a        jnb TI_1,$        clr TI_1        mov a,STATUS        ret;------------------------------;从BC01的中断缓冲区读出一个字节;入口参数: R0 == 00H 为空不延时;             != 00H 为空延时5ms;返回参数: R6 == 00H 读数据成功;             != 00H 缓冲区为空;          R7 <-读出的数据;------------------------------BC01_GetByte:    push acc    push psw    push dpl    push dphBC01_CBUF:    mov dptr,#SP0_WL       ;取出写指针低八位放入B    movx a,@dptr    mov b,a    mov dptr,#SP0_RL       ;取出读指针低八位放入A    movx a,@dptr    cjne a,b,BC01Get     ;(A) != (B) , 缓冲区非空 , 跳至BC01_Get    ;低八位相等    mov dptr,#SP0_WH       ;取出写指针高八位放入B    movx a,@dptr    mov b,a    mov dptr,#SP0_RH       ;取出读指针高八位放入A    movx a,@dptr    cjne a,b,BC01Get     ;(A) != (B) , 缓冲区非空 , 跳至BC01_GetBC01_Wait:    cjne r0,#00,BC01_Delay    ;接收缓冲区为空    mov r6,#0ffh    mov r7,#00h    pop dph    pop dpl    pop psw    pop acc    retBC01_Delay:    lcall Delay5ms    mov r0,#00h    ljmp BC01_CBUFBC01Get:    ;缓冲区非空,取出1个字节    mov dptr,#SP0_RL       ;取出读指针低八位->B    movx a,@dptr    mov b,a    mov dptr,#SP0_RH       ;取出读指针高八位->DPH    movx a,@dptr    mov dph,a    mov dpl,b    ;读出数据    movx a,@dptr           ;读出缓冲区数据->R7    mov r7,a    mov r6,#00h            ;读数据成功(R6=00h)    ;读出的单元清零    mov a,#00h    movx @dptr,a    ;修改读指针    inc dptr               ;写指针下移一个单元    mov a,dph    cjne a,#SP0_BH,BC01_SaveR   ;比较写指针是否指向缓冲区底部    ;读指针指向底部,修改为顶部    mov dpl,#SP0_LL    mov dph,#SP0_LHBC01_SaveR:    ;修读写指针    mov b,dpl    mov a,dph    mov dptr,#SP0_RH    movx @dptr,a    mov dptr,#SP0_RL    mov a,b    movx @dptr,a    pop dph    pop dpl    pop psw    pop acc    ret;------------------------------;从BUM的中断缓冲区读出一个字节;入口参数: R0 == 00H 为空不延时;             != 00H 为空延时5ms;返回参数: R6 == 00H 读数据成功;             != 00H 缓冲区为空;          R7 <-读出的数据;------------------------------BUM_GetByte:    push acc    push psw    push dpl    push dphBUM_CBUF:    mov dptr,#SP1_WL       ;取出写指针低八位放入B    movx a,@dptr    mov b,a    mov dptr,#SP1_RL       ;取出读指针低八位放入A    movx a,@dptr    cjne a,b,BUMGet        ;(A) != (B) , 缓冲区非空 , 跳至BUM_Get    ;低八位相等    mov dptr,#SP1_WH       ;取出写指针高八位放入B    movx a,@dptr    mov b,a    mov dptr,#SP1_RH       ;取出读指针高八位放入A    movx a,@dptr    cjne a,b,BUMGet        ;(A) != (B) , 缓冲区非空 , 跳至BUM_GetBUM_Wait:    cjne r0,#00,BUM_Delay    ;接收缓冲区为空    mov r6,#0ffh    mov r7,#00h    pop dph    pop dpl    pop psw    pop acc    retBUM_Delay:    lcall Delay5ms    mov r0,#00h    ljmp BUM_CBUFBUMGet:    ;缓冲区非空,取出1个字节    mov dptr,#SP1_RL       ;取出读指针低八位->B    movx a,@dptr    mov b,a    mov dptr,#SP1_RH       ;取出读指针高八位->DPH    movx a,@dptr    mov dph,a    mov dpl,b    ;读出数据    movx a,@dptr           ;读出缓冲区数据->R7    mov r7,a    mov r6,#00h            ;读数据成功(R6=00h)    ;读出的单元清零    mov a,#00h    movx @dptr,a    ;修改读指针    inc dptr               ;写指针下移一个单元    mov a,dph    cjne a,#SP1_BH,BUM_SaveR   ;比较写指针是否指向缓冲区底部    ;读指针指向底部,修改为顶部    mov dpl,#SP1_LL    mov dph,#SP1_LHBUM_SaveR:    ;修读写指针    mov b,dpl    mov a,dph    mov dptr,#SP1_RH    movx @dptr,a    mov dptr,#SP1_RL    mov a,b    movx @dptr,a    pop dph    pop dpl    pop psw    pop acc    ret;---------------------;发送一条HCI指令到BC01;指令首地址:DPTR;---------------------BC01_PutCommand:        push psw        ;PSW,ACC,R6        push acc        mov a,r6        push acc        mov a,#00h        movc a,@a+dptr  ;指令长度->APC_Continue:        jz PCReturn     ;A=0,发送完成返回        inc dptr        ;指令指针下移        mov r6,a        ;指令长度->R6        mov a,#00h        movc a,@a+dptr  ;指令内容->A        lcall BC01_PutByte          ;发送指令内容        mov a,r6        ;指令长度->A        dec a           ;(指令长度-1)->A        sjmp PC_ContinuePCReturn:        pop acc         ;R6,ACC,PSW        mov r6,a        pop acc        pop psw        ret;------------------------------------------------------------------------------------;Bluetooth Host Controller Interface Command;------------------------------------------------------------------------------------;-------------;发送HCI_Reset;-------------HCI_Reset:    push acc    mov a,#01h    lcall BC01_PutByte    mov a,#03h    lcall BC01_PutByte    mov a,#0ch    lcall BC01_PutByte    mov a,#00h        ;Length    lcall BC01_PutByte    pop acc    ret;--------------------;发送HCI_Read_BD_ADDR;--------------------HCI_Read_BD_ADDR:    push acc    mov a,#01h    lcall BC01_PutByte    mov a,#09h    lcall BC01_PutByte    mov a,#10h    lcall BC01_PutByte    mov a,#00h        ;Length    lcall BC01_PutByte    pop acc    ret;---------------------------------;发送HCI_Set_Event_Filter;指令参数:;  Filter_Type           = R0(02H);  Filter_Condition_Type = R1(00H);  Condition             = R2(02H);---------------------------------HCI_Set_Event_Filter:    push acc    mov a,#01h    lcall BC01_PutByte    mov a,#05h    lcall BC01_PutByte    mov a,#0ch    lcall BC01_PutByte    cjne r0,#00h,HCI_SEF    mov a,#01h        ;Length    lcall BC01_PutByte    mov a,r0          ;Filter_Type(00H)    lcall BC01_PutByte    pop acc    retHCI_SEF:    mov a,#03h    lcall BC01_PutByte    mov a,r0          ;Filter_Type    lcall BC01_PutByte    mov a,r1          ;Filter_Condition_Type    lcall BC01_PutByte    mov a,r2          ;Condition    lcall BC01_PutByte    pop acc    ret;-------------------------------------;发送HCI_Write_Page_Scan_Activity;指令参数:;  Page_Scan_Interval = (R1,R0)(0040H);  Page_Scan_Window   = (R3,R2)(0020H);-------------------------------------HCI_Write_Page_Scan_Activity:    push acc    mov a,#01h    lcall BC01_PutByte    mov a,#1ch    lcall BC01_PutByte    mov a,#0ch    lcall BC01_PutByte    mov a,#04h        ;Length    lcall BC01_PutByte    mov a,r0          ;Page_Scan_Interval    lcall BC01_PutByte    mov a,r1    lcall BC01_PutByte    mov a,r2          ;Page_Scan_Window    lcall BC01_PutByte    mov a,r3    lcall BC01_PutByte    pop acc    ret;----------------------------------------;发送HCI_Write_Inquiry_Scan_Activity;指令参数:;  Inquiry_Scan_Interval = (R1,R0)(0040H);  Inquiry_Scan_Window   = (R3,R2)(0020H);----------------------------------------HCI_Write_Inquiry_Scan_Activity:    push acc    mov a,#01h    lcall BC01_PutByte    mov a,#1eh    lcall BC01_PutByte    mov a,#0ch    lcall BC01_PutByte    mov a,#04h        ;Length    lcall BC01_PutByte    mov a,r0          ;Inquiry_Scan_Interval    lcall BC01_PutByte    mov a,r1    lcall BC01_PutByte    mov a,r2          ;Inquiry_Scan_Window    lcall BC01_PutByte    mov a,r3    lcall BC01_PutByte    pop acc    ret;-------------------------;发送HCI_Write_Scan_Enable;指令参数:;  Scan_Enable = R0(03H);-------------------------HCI_Write_Scan_Enable:    push acc    mov a,#01h    lcall BC01_PutByte    mov a,#1ah    lcall BC01_PutByte    mov a,#0ch    lcall BC01_PutByte    mov a,#01h        ;Length    lcall BC01_PutByte    mov a,r0          ;Scan_Enable    lcall BC01_PutByte    pop acc    ret;---------------------------------------;发送HCI_Inquiry;指令参数:;  LAP             = (R2,R1,R0)(9E8B33H);  Inquiry_Length  = R3(0AH);  Num_Response    = R4(08H);---------------------------------------HCI_Inquiry:    push acc    mov a,#01h    lcall BC01_PutByte    mov a,#01h    lcall BC01_PutByte    mov a,#04h    lcall BC01_PutByte    mov a,#05h

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -