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

📄 ia4420fifo(c51).asm

📁 本例程是通过8051单片机实现对IA4420无线数传芯片的初始化
💻 ASM
字号:
;-----------------------------------------------------------------------------
;
; File Name : IA4420FIFO(C51).asm
;
; Assembler : AT89C51(Fosc=12MHz)
;
; Purpose : Sample program for IA4420 initialize and Transceiver testing
;        
; Copyright (c) 2005 by Grandatech, All Rights Reserved
;
; Prepare By: Find Duan
;
; Support Email: dragonlong@grandatech.com
;
; Notice: Use four lines mode,they are SDO,SDI,NSEL,SCK.
;         (NFFS must contact High level)
;
;-----------------------------------------------------------------------------

sdi		bit	P3.4
sck		bit	P3.5
nsel		bit	P3.6
sdo		bit	P3.7

workflag	data	28h
comdata1	data	3dh
comdata2	data	3eh
bytedata	data	3fh
rxdata		data	40h	;16,接收数据寄存器组
txdata		data	50h	;16,发送数据寄存器组
revframe	bit	workflag.0


org	0000h
jmp	main

;--------- main start --------------------------------
org	0030h
main:
	mov	P1,#0ffh
	mov	P3,#0cfh
	mov	50h,#02dh
	mov	51h,#0d4h
	mov	52h,#0fah
	mov	53h,#001h
	mov	54h,#055h
	call	ia442xinit
	call	spirevtwobyte
	mov	comdata1,#082h		;电源管理
	mov	comdata2,#088h
	call	spisendcommand

mainloop:
	mov	comdata1,#0cah		;FIFO COMMAND
	mov	comdata2,#083h
	call	spisendcommand
mainloop1:
	nop
	nop
	nop
	clr	sdi
	clr	nsel
	jb	sdo,revstart		;检测是否收到数据

	mov	a,P1			;按键扫描
	anl	a,#0f0h
	xrl	a,#0f0h
	jz	mainloop1
	mov	r6,#64h
	call	delayn00us
	mov	a,P1
	anl	a,#0f0h
	xrl	a,#0f0h
	jz	mainloop1
	mov	a,P1
	orl	a,#00fh
	mov	54h,a
	call	txregframe		;发送数据
	jmp	mainloop
			
revstart:				;开始接收
	mov	r0,#40h
	call	fiforxframe
	jnb	revframe,mainloop
	clr	revframe
	mov	a,42h
	swap	a
	mov	P1,a
	mov	r6,#0fah
	call	delayn00us
	mov	r6,#0fah
	call	delayn00us
	mov	r6,#0fah
	call	delayn00us
	mov	P1,#0ffh
	jmp	mainloop
;--------- main end -------------------------------------

;--------- ia442xinit start -----------------------------
ia442xinit:				;IA442x初始化
	mov	comdata1,#080h		;配置命令
	mov	comdata2,#0fdh                    ;???晶振负载电容配置在哪个引脚?
	call	spisendcommand
	mov	comdata1,#082h		;电源管理
	mov	comdata2,#00ch
	call	spisendcommand
	mov	comdata1,#0a0h		;频率设置
	mov	comdata2,#080h
	call	spisendcommand
	mov	comdata1,#0c6h		;波特率设置
	mov	comdata2,#023h              ;当前设置波特率为9.6K,如果将波特率设定为1.2K,则寄存器值应改为:#0c6a4H
	call	spisendcommand
	mov	comdata1,#094h		;接收控制
	mov	comdata2,#083h
	call	spisendcommand
	mov	comdata1,#0c2h		;数据滤波
	mov	comdata2,#0ech
	call	spisendcommand
	mov	comdata1,#0cah		;FIFO COMMAND
	mov	comdata2,#081h
	call	spisendcommand
	mov	comdata1,#0c4h		;AFC COMMAND
	mov	comdata2,#0e7h
	call	spisendcommand
	mov	comdata1,#098h		;TXCTRL
	mov	comdata2,#040h
	call	spisendcommand
	mov	comdata1,#0ffh		;WAKEUP
	mov	comdata2,#0ffh
	call	spisendcommand
	mov	comdata1,#0c8h		;间歇工作
	mov	comdata2,#00eh
	call	spisendcommand
	mov	comdata1,#0c0h		;时钟输出
	mov	comdata2,#060h
	call	spisendcommand
	ret
;--------- ia442xinit end ---------------------------------

;--------- fiforxframe start ------------------------------
fiforxframe:				;IA442x接收一帧数据
	call	spirevbyte
	call	spirevbyte
	call	spirevbyte
	setb	nsel
	mov	a,bytedata
	mov	@r0,a
	cjne	a,#0fah,fiforevret
	clr	sdi
	clr	nsel
	jnb	sdo,$
	call	spirevbyte
	call	spirevbyte
	call	spirevbyte
	setb	nsel
	inc	r0
	mov	a,bytedata
	mov	@r0,a
	anl	a,#0fh
	mov	r3,a
revnextbyte:
	clr	sdi
	clr	nsel
	jnb	sdo,$
	call	spirevbyte
	call	spirevbyte
	call	spirevbyte
	setb	nsel
	inc	r0
	mov	a,bytedata
	mov	@r0,a
	djnz	r3,revnextbyte
	setb	revframe
fiforevret:
	setb	nsel
	mov	comdata1,#0cah
	mov	comdata2,#081h
	call	spisendcommand
	ret
;--------- fiforxframe end -------------------------------

;--------- txregframe start ------------------------------
txregframe:			;IA442x发送一帧数据
	mov	comdata1,#82h
	mov	comdata2,#28h
	call	spisendcommand
	mov	r0,#50h
	mov	r3,53h
	mov	a,#04h
	add	a,r3
	mov	r3,a
nextbyte:
	clr	nsel
	jnb	sdo,$
	mov	comdata1,#0b8h
	mov	comdata2,@r0
	call	spisendcommand
	inc	r0
	djnz	r3,nextbyte
	clr	nsel
	nop
	jnb	sdo,$
	mov	comdata1,#0b8h
	mov	comdata2,#0aah
	call	spisendcommand
	nop
	clr	nsel
	nop
	jnb	sdo,$
	nop
	nop
	mov	comdata1,#082h
	mov	comdata2,#088h
	call	spisendcommand
	call	spirevtwobyte
	ret
;--------- txregframe end --------------------------------

;--------- spisendcommand start --------------------------
spisendcommand:				;写指令
	clr	nsel
	mov	bytedata,comdata1
	call	spisendbyte
	mov	bytedata,comdata2
	call	spisendbyte
	setb	nsel
	ret
;--------- spisendcommand end ----------------------------

;--------- spisendbyte start -----------------------------
spisendbyte:				;写8位数据
	mov	r2,#08h
	mov	a,bytedata
	clr	c
nextbit:
	clr	sck
	rlc	a
	mov	sdi,c
	nop
	setb	sck
	djnz	r2,nextbit
	clr	sck
	clr	sdi
	ret
;--------- spisendbyte end -------------------------------

;--------- spirevtwobyte start ---------------------------
spirevtwobyte:				;读状态
	clr	nsel
	call	spirevbyte
	mov	comdata1,bytedata
	call	spirevbyte
	mov	comdata2,bytedata
	setb	nsel
	ret
;--------- spirevtwobyte end -----------------------------

;--------- spirevbyte start ------------------------------
spirevbyte:				;读8位数据
	mov	r2,#08h
	clr	sdi
	clr	sck
	clr	a
revnextbit:
	setb	sck
	mov	c,sdo
	rlc	a
	clr	sck
	djnz	r2,revnextbit
	mov	bytedata,a
	ret
;--------- spirevbyte end --------------------------------

;--------- delayn00us start ------------------------------
delayn00us:
	mov	r7,#80h
delayloop:
	nop
	nop
	nop
	nop
	djnz	r7,delayloop
	djnz	r6,delayn00us
	ret
;--------- delayn00us end --------------------------------
	end

⌨️ 快捷键说明

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