📄 spi.lis
字号:
.module spi.c
.area text(rom, con, rel)
0000 .dbfile E:\无线传感器网络资料\cc2420驱动\测试1\RX\spi.c
0000 .dbfunc e init_spi _init_spi fV
0000 ; temp -> R16
.even
0000 _init_spi::
0000 .dbline -1
0000 .dbline 21
0000 ; /***************************************
0000 ; *2008,浙江工业大学信息与控制研究所
0000 ; *All rights reserved
0000 ; *
0000 ; *文件名称:SPI.c
0000 ; *摘 要:SPI的子程序实现
0000 ; *
0000 ; *当前版本:1.1
0000 ; *作 者:王微
0000 ; *完成日期:2008.4.22
0000 ; ****************************************/
0000 ;
0000 ; #include"spi.h"
0000 ;
0000 ; /*************************************************
0000 ; 函数功能:初始化SPI口
0000 ; 输入参数:无
0000 ; 返回值:无
0000 ; **************************************************/
0000 ; void init_spi(void)
0000 ; {
0000 .dbline 23
0000 ; unsigned char temp;
0000 ; DDRB|=(1<<MOSI)|(1<<SCK)|(1<<CSn);//设置MOSI、SCK和SS 为输出,其他为输入
0000 87B3 in R24,0x17
0002 8760 ori R24,7
0004 87BB out 0x17,R24
0006 .dbline 24
0006 ; DDRE|=(1<<VREGEN)|(1<<RST);
0006 82B1 in R24,0x2
0008 8C60 ori R24,12
000A 82B9 out 0x2,R24
000C .dbline 26
000C ;
000C ; SPCR = (1<<SPE)|(1<<MSTR);//|(1<<SPR0);// 使能SPI,主机模式,设置时钟速率为fck/4
000C 80E5 ldi R24,80
000E 8DB9 out 0xd,R24
0010 .dbline 27
0010 ; SPSR = BIT(SPI2X); //SPI时钟加倍
0010 81E0 ldi R24,1
0012 8EB9 out 0xe,R24
0014 .dbline 29
0014 ;
0014 ; temp = SPSR; //!!! 读一次SPSR为了清除SPIF位和WCOL位
0014 0EB1 in R16,0xe
0016 .dbline 31
0016 ;
0016 ; temp = SPDR; //清空SPI,和中断标志,使SPI空闲
0016 0FB1 in R16,0xf
0018 .dbline -2
0018 L1:
0018 .dbline 0 ; func end
0018 0895 ret
001A .dbsym r temp 16 c
001A .dbend
001A .dbfunc e SpiWrite _SpiWrite fc
001A ; temp -> R20
001A ; temp1 -> R22
001A ; data_spi -> R16
.even
001A _SpiWrite::
001A 00D0 rcall push_gset2
001C .dbline -1
001C .dbline 40
001C ; }
001C ;
001C ; /**************************************************
001C ; 函数功能:写SPI一个字节
001C ; 输入参数:SPI指令
001C ; 返回值:对应指令的结果
001C ; **************************************************/
001C ; unsigned char SpiWrite(unsigned char data_spi)
001C ; {
001C .dbline 42
001C ; unsigned char temp,temp1;
001C ; SPDR=data_spi;
001C 0FB9 out 0xf,R16
001E L3:
001E .dbline 43
001E .dbline 43
001E .dbline 43
001E L4:
001E .dbline 43
001E ; while(!(SPSR & (1<<SPIF))){;}//等待传输结束
001E 779B sbis 0xe,7
0020 FECF rjmp L3
0022 .dbline 44
0022 ; temp1=SPDR;
0022 6FB1 in R22,0xf
0024 .dbline 45
0024 ; temp = SPSR;
0024 4EB1 in R20,0xe
0026 .dbline 47
0026 ;
0026 ; return temp1;
0026 062F mov R16,R22
0028 .dbline -2
0028 L2:
0028 00D0 rcall pop_gset2
002A .dbline 0 ; func end
002A 0895 ret
002C .dbsym r temp 20 c
002C .dbsym r temp1 22 c
002C .dbsym r data_spi 16 c
002C .dbend
002C .dbfunc e enable_spi _enable_spi fV
.even
002C _enable_spi::
002C .dbline -1
002C .dbline 57
002C ; }
002C ;
002C ; /*******************************************
002C ; *函数功能:使能SPI口
002C ; *输入参数:无
002C ; *输出参数:无
002C ; *返 回 值:无
002C ; ********************************************/
002C ; void enable_spi(void)
002C ; {
002C .dbline 58
002C ; PORTB &=~(1<<CSn); //使能SPI口
002C C098 cbi 0x18,0
002E .dbline -2
002E L6:
002E .dbline 0 ; func end
002E 0895 ret
0030 .dbend
0030 .dbfunc e disable_spi _disable_spi fV
.even
0030 _disable_spi::
0030 .dbline -1
0030 .dbline 68
0030 ; }
0030 ;
0030 ; /*******************************************
0030 ; *函数功能:禁止SPI口
0030 ; *输入参数:无
0030 ; *输出参数:无
0030 ; *返 回 值:无
0030 ; ********************************************/
0030 ; void disable_spi(void)
0030 ; {
0030 .dbline 69
0030 ; PORTB |=(1<<CSn); //禁止SPI口
0030 C09A sbi 0x18,0
0032 .dbline -2
0032 L7:
0032 .dbline 0 ; func end
0032 0895 ret
0034 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -