📄 fr_driver.asm
字号:
.PUBLIC _FR_W
_FR_W:
// PUSH BP TO [SP] //提取参数到R1
// BP = SP + 1
// R1 = [BP+3]
// POP BP FROM [SP]
r1 = r1 lsl 4
r1 = r1 lsl 4 //把低八位左移到高八位
r1 = r1&0xff00 //屏蔽掉低八位
push r2,r5 to [sp] //保护现场
r2 = [Port_Data] //注意,所有输入操作全是Buffer寄存器
r2 = r2|SCK //设置SCK为高电平
r3 = r2&(~SCK) //r2为SCK的高电平为,r3为SCK的低电平
r4 = 8 //R4置8,循环8次
?loopw:
r5 = r1&0x8000 //取最高位给R5
r1 = r1 lsl 1 //R1左移一位
test r5,0x8000
jz ?FR_DL
r5 = [Port_Data]
r5 = r5|MOSI //MOSI置1
jmp ?write
?FR_DL:
r5 = [Port_Data] //获取端口信息
r5 = r5&(~MOSI) //把MOSI位置0
?write:
[Port_Data] = r2 //CLK置高
nop
[Port_Data] = r3 //CLK置低
[Port_Data] = r5 //写入一个位
//call delay
r4 = r4-1
jnz ?loopw
pop r2,r5 from [sp] //恢复现场
retf
//========================================================
// 汇编格式: _CLR
// C格式: void CLR(unsigned int)
// 实现功能: 位置清零
// 入口参数: 无
// 出口参数: 无
// 破坏寄存器:r1
//========================================================
.PUBLIC _CLR
_CLR:
PUSH BP TO [SP] //提取参数到R1
BP = SP + 1
R1 = [BP+3]
POP BP FROM [SP]
push r2 to [sp] //保护现场
r2 = [Port_Data] //读取DATA值(仅是一位)
r1^=0xffff //置反
r1&=r2
//位置清零
[Port_Data] = r1 //把数据返回端口
pop r2 from [sp] //恢复现场
retf
//========================================================
// 汇编格式: _SET
// C格式: void SET(unsigned int)
// 实现功能: 位置置一
// 入口参数: 无
// 出口参数: 无
// 破坏寄存器:r1
//========================================================
.PUBLIC _SET
_SET:
PUSH BP TO [SP] //提取参数到R1
BP = SP + 1
R1 = [BP+3]
POP BP FROM [SP]
push r2 to [sp] //保护现场
r2 = [Port_Data] //读取DATA值(仅是一位)
r1|=r2 //位置置一
[Port_Data] = r1 //把数据返回端口
pop r2 from [sp] //恢复现场
retf
//========================================================
// 汇编格式: _FR_DataReady
// C格式: unsigned int FR_DataReady(void)
// 实现功能: 数据准备好了或者数据发送完成了,循环等待数据完成
// 入口参数: 无
// 出口参数: 无
// 破坏寄存器:r1
//========================================================
.PUBLIC _FR_DataReady
_FR_DataReady:
loopr:
push r2 to [sp]
r2=1
[P_WatchDog_Clear]=r2
r1 = [Port_Data]
r1 = r1&DR
cmp r1,DR
jnz loopr
pop r2 from [sp]
retf
//待机模式
.public _FR_StandBy
_FR_StandBy:
r1 = [Port_Data]
r1|=(PWR+TXEN)
r1&=~TRX_EN
[Port_Data]=r1
retf
//发射模式
.public _FR_TxOn
_FR_TxOn:
r1=[Port_Data]
r1|=(PWR+TXEN+TRX_EN)
[Port_Data]=r1
retf
//开始启动发送
.public _FR_TxSend
_FR_TxSend:
r1=[Port_Data]
r1|=TRX_EN //TRX_EN置一
[Port_Data]=r1
//call _FR_DataReady //检测数据是否OK
r1=[Port_Data]
r1&=~TRX_EN
[Port_Data]=r1 //TRX_EN置零
retf
//接收模式开启
.public _FR_RxOn
_FR_RxOn:
r1=[Port_Data]
r1|=(PWR+TRX_EN)
r1&=~TXEN
[Port_Data]=r1
retf
//配置FR
.public _FR_Config
_FR_Config:
r1=[Port_Data]
r1&=~CSN // Spi 片选开
[Port_Data]=r1
r1=WC // 写配置命令
call _FR_W
r1=CH_NO_BYTE //中心频率低8位
call _FR_W
r1=PA_PWR_10dBm | HFREQ_PLL_433MHz //发射+10dBm,发射频率433MHz,中心频率第9位=0
call _FR_W
r1=TX_AFW_4BYTE | RX_AFW_4BYTE //接收地址宽度4字节,发送地址宽度4字节
call _FR_W
r1=RX_PW_32BYTE //接收数据宽度32字节
call _FR_W
r1=TX_PW_32BYTE //发送数据宽度32字节
call _FR_W
r1=RX_ADDRESS_0 //接收有效地址第1字节
call _FR_W
r1=RX_ADDRESS_1 //接收有效地址第2字节
call _FR_W
r1=RX_ADDRESS_2 //接收有效地址第3字节
call _FR_W
r1=RX_ADDRESS_3 //接收有效地址第4字节
call _FR_W
r1=CRC16_EN | XOF_16MHz //CRC16模式使能,晶体振荡器频率16MHz
call _FR_W
r1=[Port_Data]
r1|=CSN // Spi 片选关
[Port_Data]=r1
retf
//掉电模式 PwrDown
.public _FR_Off
_FR_Off:
r1=[Port_Data]
r1&=~PWR
[Port_Data]=r1
retf
//写Tx地址
.public _FR_SetTxAddr
_FR_SetTxAddr:
r1=[Port_Data]
r1&=~CSN // Spi 片选开
[Port_Data]=r1
r1=WTA //写Tx地址的命令
call _FR_W
r1=TX_ADDRESS_0 //接收有效地址第1字节
call _FR_W
r1=TX_ADDRESS_1 //接收有效地址第2字节
call _FR_W
r1=TX_ADDRESS_2 //接收有效地址第3字节
call _FR_W
r1=TX_ADDRESS_3 //接收有效地址第4字节
call _FR_W
r1=[Port_Data]
r1|=CSN // Spi 片选关
[Port_Data]=r1
retf
//写入发送的内容
.PUBLIC _FR_SetData
_FR_SetData:
PUSH BP TO [SP] //提取参数到R1
BP = SP + 1
R1 = [BP+3]
POP BP FROM [SP]
PUSH R2 TO [SP] //保护R2内容
R2=R1 //参数转移到R2
r1=[Port_Data]
r1&=~CSN // Spi 片选开
[Port_Data]=r1
r1=WTP //写TxPayload
call _FR_W
r1=r2 //这里的R2是要传送的参数
call _FR_W
r1=[Port_Data]
r1|=CSN // Spi 片选关
[Port_Data]=r1
retf
//读出接收到的数据
.public _FR_ReadData
_FR_ReadData:
push r2 to [sp] //保护现场
r1=[Port_Data]
r1&=~CSN // Spi 片选开
[Port_Data]=r1
call _FR_DataReady //等待数据准备完毕
r1=RRP //读RxPayload
call _FR_W
call _FR_R //开始真正读数据,数据读到R1里面
r2=r1 //数据传到R2里面
r1=[Port_Data]
r1|=CSN // Spi 片选关
[Port_Data]=r1
r1=r2 //数据恢复到r1
pop r2 from [sp] //恢复现场
retf
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -