zhliangxi 发表于 2009-10-30 14:57:52

急求用汇编写的BK2411通信程序.

最近两三天在调BK2411。
采用台湾sonix的2613。
按照指导书的,还没有调通。
请问哪位仁兄有用汇编调通过BK2411?
固定频率,固定地址,开启自动应答功能.收发的数据包是固定长度的。

我的QQ是:304539614
电邮是:zhliangxi@gmail.com

lowwr 发表于 2009-10-30 15:31:37

这个可以直接用NRF24L01 的程序 他们兼容的

zhliangxi 发表于 2009-10-31 23:41:23

已经OK了,是延时函数有点没处理好。

大家有关BK2411的问题可以联系我

rqiang 发表于 2009-12-15 14:50:17

【2楼】 zhliangxi 喜哥
最近也在搞这个2411,用单片机模拟SPI的,但初始化不成功,能提供参考意见不?

rqiang 发表于 2009-12-29 20:45:45

已经搞定了,多谢【2楼】 zhliangxi 喜哥
的帮忙,多谢阿阿莫提供的这个平台,大家有遇到BK2411的问题的,可以提供帮助!

hyxtc 发表于 2010-3-20 20:15:09

;------------------------------------------------------------------------------
;BK2411初始化
;------------------------------------------------------------------------------
InitRF:
        BCLR        BK2411CE
        BSET        BK2411CSN
        BCLR        BK2411SCK
        MOV        A,#80
        CALL        Delay_ms

        B0BCLR        CFG
        CALL        SwitchCFG                ;CFG=0
       
        MOV        A,#21
        MOV        i,A
        MOV        A,#20
        MOV        Kpointer,A
       
InitRFLoop0:
        CALL        RegArrFSK_table
        MOV        A,#0X20
        OR        A,RegArrFSKH                ;高位
        MOV        RWRegAddr,A
        MOV        A,RegArrFSKL                ;低位
        MOV        RWRegData,A
        CALL        SPI_RW_Reg
        MOV        A,Kpointer
        SUB        A,#1
        MOV        Kpointer,A
        DECMS        i
        JMP        InitRFLoop0
                                ;reg 10 -Rx0 addr
        MOV        A,#5
        MOV        i,A
        CLR        Kpointer

InitRFLoop1:
        CALL        RX0_ADDRESS_table
        MOV        A,Kpointer
        ADD        A,#1
        MOV        Kpointer,A
        DECMS        i
        JMP        InitRFLoop1

        MOV        A,#0X2A
        MOV        WrBufReg,A       
        MOV        A,#5
        MOV        Number,A
        CALL        SPI_Write_Buf

        MOV        A,#5
        MOV        i,A
        CLR        Kpointer
                                ;reg 11 -Rx1 addr
InitRFLoop2:       
        CALL        RX1_ADDRESS_table
        MOV        A,Kpointer
        ADD        A,#1
        MOV        Kpointer,A
        DECMS        i
        JMP        InitRFLoop2

        MOV        A,#0X2b
        MOV        WrBufReg,A       
        MOV        A,#5
        MOV        Number,A
        CALL        SPI_Write_Buf

        MOV        A,#5
        MOV        i,A
        CLR        Kpointer
                                ;reg 16 -Tx addr
InitRFLoop2_1:
        CALL        RX0_ADDRESS_table
        MOV        A,Kpointer
        ADD        A,#1
        MOV        Kpointer,A
        DECMS        i
        JMP        InitRFLoop2_1

        MOV        A,#0X30
        MOV        WrBufReg,A       
        MOV        A,#5
        MOV        Number,A
        CALL        SPI_Write_Buf


        MOV        A,#0x50                        ;ACTIVATE_CMD
        MOV        RWRegAddr,A
        MOV        A,#0X73
        MOV        RWRegData,A
        CALL        SPI_RW_Reg

        MOV        A,#2
        MOV        i,A       
        MOV        A,#22
        MOV        Kpointer,A
       
InitRFLoop3:
        CALL        RegArrFSK_table
        MOV        A,#0X20
        OR        A,RegArrFSKH
        MOV        RWRegAddr,A
        MOV        A,RegArrFSKL
        MOV        RWRegData,a
        CALL        SPI_RW_Reg
        MOV        A,Kpointer
        SUB        A,#1
        MOV        Kpointer,A
        DECMS        i
        JMP        InitRFLoop3

        B0BSET        CFG
        CALL        SwitchCFG

        CLR        i
        CLR        FSKLong

InitRFLoop4_2:
        CLR        Kpointer
        MOV        A,#4
        MOV        Number1,A
InitRFLoop4_1:
        CALL        RegArrFSKAnalog_table
        MOV        A,#1
        ADD        Kpointer,A
        DECMS        Number1
        JMP        InitRFLoop4_1
        MOV        A,#4
        MOV        Number,A
        MOV        A,#0X20
        OR        A,i
        MOV        WrBufReg,A
        CALL        SPI_Write_Buf
        MOV        A,#1
        ADD        i,A
        MOV        A,#14
        CMPRS        A,i
        JMP        InitRFLoop4_2       


        MOV        A,#11
        MOV        i,A
        CLR        Kpointer

InitRFLoop5:
        CALL        RegArrFSKAnalogReg14_table
        MOV        A,Kpointer
        ADD        A,#1
        MOV        Kpointer,A
        DECMS        i
        JMP        InitRFLoop5
        MOV        A,#0X2e                        ;reg14    WRITE_REG|14
        MOV        WrBufReg,A
        MOV        A,#11       
        MOV        Number,A
        CALL        SPI_Write_Buf

        MOV        A,#4
        MOV        i,A
        CLR        Kpointer
                                ;reg4 clear bit 0,1,3,23
InitRFLoop6:
        CALL        RegArrFSKAnalogreg4_table
        MOV        A,Kpointer
        ADD        A,#1
        MOV        Kpointer,A
        DECMS        i
        JMP        InitRFLoop6       
        MOV        A,#0X24
        MOV        WrBufReg,A
        MOV        A,#4
        MOV        Number,A
        CALL        SPI_Write_Buf
                                ;reg4 set bit 25,26
       // mov   a,        #10
        //call    Delay_Ms
        CLR        Kpointer
        MOV        A,#0X47
        MOV        CodeAddr,A
        CALL        KeepWrBufAddr_table
        MOV        A,#0X24
        MOV        WrBufReg,A
        MOV        A,#4
        MOV        Number,A
        CALL        SPI_Write_Buf
                                ;reg4 clear bit 25,26
      //mov   a,        #10
        //call    Delay_Ms       
        CLR        Kpointer
        MOV        A,#0X41
        MOV        CodeAddr,A
        CALL        KeepWrBufAddr_table
        MOV        A,#0X24
        MOV        WrBufReg,A
        MOV        A,#4
        MOV        Number,A
        CALL        SPI_Write_Buf

        MOV        A,#50
        CALL        Delay_ms
                                ;reg4 set bit 0,1,3,23

        MOV        A,#4
        MOV        i,A
        MOV        A,#16
        MOV        FSKLong,A
        CLR        Kpointer
InitRFLoop7:
        CALL        RegArrFSKAnalog_table
        MOV        A,#1
        ADD        Kpointer,A
        DECMS        i
        JMP        InitRFLoop7
        MOV        A,#24
        MOV        WrBufReg,A
        MOV        A,#4
        MOV        Number,A
        CALL        SPI_Write_Buf

        B0BCLR        CFG
        CALL        SwitchCFG
       
        MOV        A,#5
        MOV        i,A
        CLR        Kpointer

InitRFLoop8:
        CALL        TX_ADDRESS_table
        MOV        A,Kpointer
        ADD        A,#1
        MOV        Kpointer,A
        DECMS        i
        JMP        InitRFLoop8
        MOV        A,#0X30                        ;写本地地址 WRITE_REG + TX_ADDR
        MOV        WrBufReg,A
        MOV        A,#5
        MOV        Number,A
        CALL        SPI_Write_Buf

        MOV        A,#5
        MOV        i,A
        CLR        Kpointer

InitRFLoop9:
        CALL        RX_ADDRESS_table
        MOV        A,Kpointer
        ADD        A,#1
        MOV        Kpointer,A
        DECMS        i
        JMP        InitRFLoop9
        MOV        A,#0X2A                        ;写接收端地址 WRITE_REG + RX_ADDR_P0
        MOV        WrBufReg,A
        MOV        A,#5
        MOV        Number,A
        CALL        SPI_Write_Buf       

        MOV        A,#0X21                        ;WRITE_REG +EN_AA
        MOV        RWRegAddr,A
        MOV        A,#0X01
        MOV        RWRegData,A
        CALL        SPI_RW_Reg

        MOV        A,#0X22                        ;WRITE_REG +EN_RXADDR
        MOV        RWRegAddr,A
        MOV        A,#0X01
        MOV        RWRegData,A
        CALL        SPI_RW_Reg

        MOV        A,#0X25                        ;WRITE_REG +RF_CH
        MOV        RWRegAddr,A
        MOV        A,RF_Channel                ;RF_Channel
        MOV        RWRegData,A
        CALL        SPI_RW_Reg

        MOV        A,#0X31                        ;WRITE_REG +RX_PW_P0
        MOV        RWRegAddr,A
        MOV        A,#8
        MOV        RWRegData,A
        CALL        SPI_RW_Reg

        MOV        A,#0X26                        ;WRITE_REG +RF_SETUP
        MOV        RWRegAddr,A
        MOV        A,#0X07
        MOV        RWRegData,A
        CALL        SPI_RW_Reg

        MOV        A,#0X20                        ;WRITE_REG +CONFIG
        MOV        RWRegAddr,A
        MOV        A,#0X0E
        MOV        RWRegData,A
        CALL        SPI_RW_Reg

        MOV        A,#0X23                        ;WRITE_REG +SETUP_AW
        MOV        RWRegAddr,A
        MOV        A,#0X02
        MOV        RWRegData,A
        CALL        SPI_RW_Reg

        /*
        MOV        A,#0X24                        ;WRITE_REG +SETUP_RETR
        MOV        RWRegAddr,A
        MOV        A,#0X1A
        MOV        RWRegData,A
        CALL        SPI_RW_Reg
      */
      B0BCLR        CFG
        CALL        SwitchCFG                ;CFG=0

        RET

;----------------------------------------------延时函数
Delay_ms:
        mov        DelayTime0,a
LMsLoop3:       
        mov        a,#10
        mov        DelayTime1,a
   LMsLoop2:       
        mov        a,#100
        mov        DelayTime2,a
    LMsLoop1:
        decms        DelayTime2
        jmp        LMsLoop1
        decms        DelayTime1
        jmp        LMsLoop2
        decms        DelayTime0
        jmp        LMsLoop3
        ret
;------------------------------------------------------------------
;入口参数:        CFG                                                
;
;------------------------------------------------------------------
SwitchCFG:
        mov        A,#7
        MOV        ReadReg,A
        call        SPI_Read       
        mov        CFG_TMP,a
       
LGetCfg01:
        bts1        CFG_TMP.7                ;为1时跳过下一条指令 检验CFG标志
        jmp        LGetCfg10
        B0BTS0        CFG                        ;CFG为0时 执行SPI_WR_REG
        jmp        LCFGEND
LGetCfg:       
        mov        a,#0X50                ;ACTIVATE_CMD
        mov        RWRegAddr,a
        mov        a,#0x53
        MOV        RWRegData,a
        call        SPI_RW_Reg        ;REG value->acc
        jmp        lCFGEND
LGetCfg10:       
        B0BTS0        CFG                        ;CFG为1时 执行下一条指令 SPI_WR_REG
        jmp        LGetCfg
lCFGEND:

        ret
;-------------------------------------------------------------------------------
;功 能: Writes one byte to nRF24L01, and return the byte read
;               from nRF24L01 during write, according to SPI protocol
;-------------------------------------------------------------------------------

SPI_RW:
        mov        RWValue,a
        mov        a,#8
        mov        bit_ctr,a
        BCLR        BK2411SCK
        NOP
        NOP
        NOP
LSpiLoop:
        bts0        RWValue.7                ;高位为0则跳过下一条指令执行MosiToL
        jmp        MosiToH
MosiToL:
        BCLR        BK2411MOSI                ;MOSI端口置0
        NOP
        NOP
        NOP
        JMP        MosiToHLEnd
MosiToH:
        BSET        BK2411MOSI                ;MOSI端口置1
        NOP

        NOP
        NOP
MosiToHLEnd:       
        BCLR        FC                        ;清进位位
        RLCM        RWValue
        BSET        BK2411SCK
        NOP
        NOP
        NOP

        BTS0        BK2411MISO                ;MISO为0跳过下一条指令
        BSET        RWValue.0
        BCLR        BK2411SCK

        NOP
        NOP
        NOP       

        DECMS        bit_ctr
        JMP        LSpiLoop
        mov        a,RWValue                ;返回值放进A
        ret
;-----------------------------------------------------------------------------------
//函 数:SPI_RW_Reg
//参 数: reg 寄存器 value 值
//功 能: Writes value 'value' to register 'reg'
;-----------------------------------------------------------------------------------
SPI_RW_Reg:
        BCLR        BK2411CSN                        ;CSN low, init SPI transaction
        MOV        A,RWRegAddr
        CALL        SPI_RW
        mov        BK_STATUS,a
       
        MOV        A,RWRegData
        call        SPI_RW
        BSET        BK2411CSN
       
        mov        a,BK_STATUS
        RET
;-----------------------------------------------------------------------------
;入口:ReadReg
;返回:ReadRegVal
;-----------------------------------------------------------------------------
SPI_Read:
        BCLR        BK2411CSN
        MOV        A,ReadReg
        CALL        SPI_RW                ;Select register to read from..
        MOV        A,#0
        CALL        SPI_RW
        MOV        ReadRegVal,A
        BSET        BK2411CSN
        ret



;----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
;入口:WrBufReg,数组        ,Number
;返回:ReadRegVal
;-----------------------------------------------------------------------------
SPI_Read_Buf:
        BCLR        BK2411CSN
        MOV        A,ReadBufReg
        CALL        SPI_RW               
        MOV        BK_STATUS,A
        CLR        Kpointer                ;清0       
        CLR        ReadBufReg                ;清0

Read_Buf_Loop0:
        MOV        A,#0
        CALL        SPI_RW
        MOV        CodeAddr,A                ;??????
        CALL        KeepTxBuf                ;把数据保存到数组里边
        MOV        A,Kpointer
        ADD        A,#1
        MOV        Kpointer,A
        DECMS        Number
        JMP        Read_Buf_Loop0
        BSET        BK2411CSN
        RET

;----------------------------------------------------------------------------


;----------------------------------------------------------------------------
SPI_Write_Buf:
        BCLR        BK2411CSN
        MOV        A,WrBufReg
        CALL        SPI_RW       
        MOV        BK_STATUS,A
        CLR        Kpointer                ;清0
Wr_Buf_Loop0:
        CALL        ReadWrBufAddr_table        ;读出来数据存放A
        CALL        SPI_RW                        ;入口参数A
        MOV        A,#1
        ADD        Kpointer,A
        DECMS        Number
        JMP        Wr_Buf_Loop0
        BSET        BK2411CSN                ;CSN=1
        MOV        A,BK_STATUS                ;返回值
        RET

;-----------------------------------------------------------------------------
;
;-----------------------------------------------------------------------------
SetRX_Mode:
        MOV        A,#5
        MOV        i,A
        CLR        Kpointer
       
RX_Mode_Loop0:                                ;循环五次把TX_ADDRESS存放到数组WrBufAddr
        CALL        RX_ADDRESS_table
        MOV        A,Kpointer
        ADD        A,#1
        MOV        Kpointer,A
        DECMS        i
        JMP        RX_Mode_Loop0
                                ;Use the same address on the RX device as the TX device
        MOV        A,#0X2A
        MOV        WrBufReg,A
        MOV        A,#5
        MOV        Number,A
        CALL        SPI_Write_Buf
       
        MOV        A,#0x21                ;允许自动应答EN_AA
        MOV        RWRegAddr,A
        MOV        A,#0x01
        MOV        RWRegData,a
        CALL        SPI_RW_Reg

        MOV        A,#0x22                ;允许RX地址EN_RXADDR
        MOV        RWRegAddr,A
        MOV        A,#0x01
        MOV        RWRegData,a
        CALL        SPI_RW_Reg

        MOV        A,#0x25                ;通道号RF_CH
        MOV        RWRegAddr,A
        MOV        A,RF_Channel        ;??RF_Channel
        MOV        RWRegData,a
        CALL        SPI_RW_Reg

        MOV        A,#0x31                ;RX_PW_P0
        MOV        RWRegAddr,A
        MOV        A,#10                ;RX_PLOAD_WIDTH=10
        MOV        RWRegData,a
        CALL        SPI_RW_Reg

        MOV        A,#0x26                ;//RF建立寄存器
        MOV        RWRegAddr,A
        MOV        A,#0x07
        MOV        RWRegData,a
        CALL        SPI_RW_Reg

        MOV        A,#0x20                ;//RF配置寄存器
        MOV        RWRegAddr,A
        MOV        A,#0x0f
        MOV        RWRegData,a
        CALL        SPI_RW_Reg
        BSET        BK2411CE
        RET
;-----------------------------------------------------------------------------
;
;-----------------------------------------------------------------------------
nRF2411_RxPacket:
        CLR        R_RxPacket
        CALL        SetRX_Mode
        MOV        A,#0x07                        ;STATUS=0X07
        MOV        ReadReg,A
        CALL        SPI_Read
        MOV        Read_STA,A
       
        BTS1        Read_STA.6                ;RX_DR 为1则跳过下一条指令
        JMP        RxPacketLoop
        MOV        A,#0x61                        ;RD_RX_PLOAD
        MOV        ReadBufReg,A                ;读缓存寄存器参数
        MOV        A,#8                        ;TX_PLOAD_WIDTH
        MOV        Number,A                ;循环次数
        CALL        SPI_Read_Buf
        MOV        A,#1
        MOV        R_RxPacket,A                ;

        JMP        RxPacketEnd



RxPacketLoop:
        BTS1        Read_STA.4
        JMP        RxPacketEnd
        BSET        BK2411CE
        MOV        A,#0xe1                        ;FLUSH_TX
        MOV        RWRegAddr,A
        MOV        A,#0
        MOV        RWRegData,A
        CALL        SPI_RW_Reg

RxPacketEnd:
        MOV        A,#0x27                        ;WRITE_REG +STATUS
        MOV        RWRegAddr,A
        MOV        A,Read_STA               
        MOV        RWRegData,A
        CALL        SPI_RW_Reg
        MOV        A,R_RxPacket
        RET
;-----------------------------------------------------------------------------
;
;-----------------------------------------------------------------------------
nRF2411_TxPacket:
        BCLR        BK2411CE
        MOV        A,#5
        MOV        i,A
        CLR        Kpointer

TxPacketLoop0:
        CALL        TX_ADDRESS_table
        MOV        A,Kpointer
        ADD        A,#1
        MOV        Kpointer,A
        DECMS        i
        JMP        TxPacketLoop0

        MOV        A,#0X30                        ;写本地地址WRITE_REG + TX_ADDR
        MOV        WrBufReg,A
        MOV        A,#5                        ;TX_ADR_WIDTH
        MOV        Number,A
        CALL        SPI_Write_Buf
       
        MOV        A,#5
        MOV        i,A
        CLR        Kpointer

TxPacketLoop1:
        CALL        TX_ADDRESS_table
        MOV        A,Kpointer
        ADD        A,#1
        MOV        Kpointer,A
        DECMS        i
        JMP        TxPacketLoop1
        MOV        A,#0X2A                        ;写接收端地址WRITE_REG + RX_ADDR_P0
        MOV        WrBufReg,A
        MOV        A,#5                        ;RX_ADR_WIDTH
        MOV        Number,A       
        CALL        SPI_Write_Buf       

        MOV        A,#6
        MOV        i,A       
        MOV        CodeAddr,A
        CLR        Kpointer
       

TxPacketLoop2:
        CALL        ReadTxBuf
        MOV        CodeAddr,A
        CALL        KeepWrBufAddr_table
        MOV        A,Kpointer
        ADD        A,#1
        MOV        Kpointer,A
        DECMS        i
        JMP        TxPacketLoop2
        MOV        A,#0Xa0                        ;发送的数据
        MOV        WrBufReg,A
        MOV        A,#6
        MOV        Number,A       
        CALL        SPI_Write_Buf

        MOV        A,#0x21                        ;WRITE_REG+EN_AA
        MOV        RWRegAddr,A
        MOV        A,#0x01
        MOV        RWRegData,A
        CALL        SPI_RW_Reg
       
        MOV        A,#0x22                        ;WRITE_REG+EN_RXADDR
        MOV        RWRegAddr,A
        MOV        A,#0x01
        MOV        RWRegData,A
        CALL        SPI_RW_Reg

        MOV        A,#0x24                        ;WRITE_REG+SETUP_RETR
        MOV        RWRegAddr,A
        MOV        A,#0x1a
        MOV        RWRegData,A
        CALL        SPI_RW_Reg

        MOV        A,#0x25                        ;WRITE_REG+RF_CH
        MOV        RWRegAddr,A
        MOV        A,RF_Channel                ;RF_Channel
        MOV        RWRegData,A
        CALL        SPI_RW_Reg

        MOV        A,#0x26                        ;WRITE_REG+RF_SETUP
        MOV        RWRegAddr,A
        MOV        A,#0X07
        MOV        RWRegData,A
        CALL        SPI_RW_Reg

        MOV        A,#0x20                        ;WRITE_REG+CONFIG
        MOV        RWRegAddr,A
        MOV        A,#0X0E
        MOV        RWRegData,A
        CALL        SPI_RW_Reg

        BSET        BK2411CE

        MOV        A,#1
        CALL        Delay_ms                ;1mS
       

        MOV        A,#0x07                        ;STATUS 地址
        MOV        ReadReg,A
        CALL        SPI_Read
        MOV        A,ReadRegVal                ;函数SPI_Readd的返回值ReadRegVal
        MOV        BK_STATUS,A
       
        MOV        A,#0x27                        ;WRITE_REG+STATUS
        MOV        RWRegAddr,A
        MOV        A,BK_STATUS
        MOV        RWRegData,A
        CALL        SPI_RW_Reg
        RET
;-----------------------------------------------------------------------------
;
;-----------------------------------------------------------------------------
SwitchToTxMode:
        MOV        A,#0XE1                        ;flushTx
        MOV        RWRegAddr,A
        MOV        A,#0x00
        MOV        RWRegData,a
        CALL        SPI_RW_Reg

        MOV        A,#0X00                        ;read register STATUS's value
        MOV        RWRegAddr,A
        MOV        A,#0X00
        MOV        RWRegData,A
        CALL        SPI_RW_Reg

        MOV        ToTxModeVar,A
        AND        A,#0XFD
        MOV        ToTxModeVar,A
        MOV        RWRegData,a
        MOV        A,#0x20                        ;WRITE_REG+CONFIG
        MOV        RWRegAddr,A
        CALL        SPI_RW_Reg

        MOV        A,ToTxModeVar
        OR        A,#0X02
        AND        A,#0XFE
        MOV        RWRegData,a
        MOV        A,#0x20                        ;WRITE_REG+CONFIG
        MOV        RWRegAddr,A
        CALL        SPI_RW_Reg
        BSET        BK2411CE
                                        ;Delay_ms
        MOV        A,#10
        MOV        DelayTime0,A       
        CALL        Delay_ms
        ret
这个写好的汇编测试可以 但是就是距离太短 用C就可以距离很长 不知道什么问题请教大家帮帮忙 谢谢!

wxmk123 发表于 2010-3-22 10:23:07

MARK~
页: [1]
查看完整版本: 急求用汇编写的BK2411通信程序.