急求用汇编写的BK2411通信程序.
最近两三天在调BK2411。采用台湾sonix的2613。
按照指导书的,还没有调通。
请问哪位仁兄有用汇编调通过BK2411?
固定频率,固定地址,开启自动应答功能.收发的数据包是固定长度的。
我的QQ是:304539614
电邮是:zhliangxi@gmail.com 这个可以直接用NRF24L01 的程序 他们兼容的 已经OK了,是延时函数有点没处理好。
大家有关BK2411的问题可以联系我 【2楼】 zhliangxi 喜哥
最近也在搞这个2411,用单片机模拟SPI的,但初始化不成功,能提供参考意见不? 已经搞定了,多谢【2楼】 zhliangxi 喜哥
的帮忙,多谢阿阿莫提供的这个平台,大家有遇到BK2411的问题的,可以提供帮助! ;------------------------------------------------------------------------------
;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就可以距离很长 不知道什么问题请教大家帮帮忙 谢谢! MARK~
页:
[1]