📄 spi.lis
字号:
.module spi.c
.area data(ram, con, rel)
0000 _Spi_Receive_Buffer::
0000 .blkb 1
.area idata
0000 00 .byte 0
.area data(ram, con, rel)
0001 .blkb 1
.area idata
0001 00 .byte 0
.area data(ram, con, rel)
0002 .blkb 1
.area idata
0002 00 .byte 0
.area data(ram, con, rel)
0003 .blkw 1
.area idata
0003 0A00 .word _Spi_Receive_Data
.area data(ram, con, rel)
0005 .blkb 1
.area idata
0005 FF .byte 255
.area data(ram, con, rel)
0006 .blkb 1
.area idata
0006 00 .byte 0
.area data(ram, con, rel)
0007 .blkb 1
.area idata
0007 00 .byte 0
.area data(ram, con, rel)
0008 .blkb 1
.area idata
0008 00 .byte 0
.area data(ram, con, rel)
0009 .dbfile D:\桌面\mp3\SPI\spi.c
0009 .dbstruct 0 9 .1
0009 .dbfield 0 front c
0009 .dbfield 1 rear c
0009 .dbfield 2 count c
0009 .dbfield 3 data pc
0009 .dbfield 5 queuesize c
0009 .dbfield 6 errorcode c
0009 .dbfield 7 status c
0009 .dbfield 8 memo c
0009 .dbend
0009 .dbsym e Spi_Receive_Buffer _Spi_Receive_Buffer S[.1]
0009 _Spi_Send_Buffer::
0009 .blkb 1
.area idata
0009 00 .byte 0
.area data(ram, con, rel)
000A .dbfile D:\桌面\mp3\SPI\spi.c
000A .blkb 1
.area idata
000A 00 .byte 0
.area data(ram, con, rel)
000B .dbfile D:\桌面\mp3\SPI\spi.c
000B .blkb 1
.area idata
000B 00 .byte 0
.area data(ram, con, rel)
000C .dbfile D:\桌面\mp3\SPI\spi.c
000C .blkw 1
.area idata
000C 0000 .word _Spi_Send_Data
.area data(ram, con, rel)
000E .dbfile D:\桌面\mp3\SPI\spi.c
000E .blkb 1
.area idata
000E 0A .byte 10
.area data(ram, con, rel)
000F .dbfile D:\桌面\mp3\SPI\spi.c
000F .blkb 1
.area idata
000F 00 .byte 0
.area data(ram, con, rel)
0010 .dbfile D:\桌面\mp3\SPI\spi.c
0010 .blkb 1
.area idata
0010 00 .byte 0
.area data(ram, con, rel)
0011 .dbfile D:\桌面\mp3\SPI\spi.c
0011 .blkb 1
.area idata
0011 00 .byte 0
.area data(ram, con, rel)
0012 .dbfile D:\桌面\mp3\SPI\spi.c
0012 .dbsym e Spi_Send_Buffer _Spi_Send_Buffer S[.1]
.area vector(rom, abs)
.org 48
0030 0C940000 jmp _spi_stc_isr
.area data(ram, con, rel)
0012 .dbfile D:\桌面\mp3\SPI\spi.c
.area text(rom, con, rel)
0000 .dbfile D:\桌面\mp3\SPI\spi.c
0000 .dbfunc e spi_stc_isr _spi_stc_isr fV
.even
0000 _spi_stc_isr::
0000 0E940000 xcall push_lset
0004 .dbline -1
0004 .dbline 63
0004 ; /*********************************************************************************************************
0004 ; ** SPI 驱动程序
0004 ; ** (c) Copyright 2006-2008, limaokui
0004 ; ** All Rights Reserved
0004 ; **
0004 ; ** V1.0.0
0004 ; **
0004 ; **
0004 ; **--------------文件信息--------------------------------------------------------------------------------
0004 ; **文 件 名:SPI.c
0004 ; **创 建 人: 李茂奎
0004 ; **最后修改日期: 2006年9月2日
0004 ; **描 述: SPI驱动程序
0004 ; **
0004 ; **--------------历史版本信息----------------------------------------------------------------------------
0004 ; ** 创建人: 李茂奎
0004 ; ** 版 本: V1.00
0004 ; ** 日 期: 2006年9月2日
0004 ; ** 描 述: 原始版本
0004 ; **
0004 ; **------------------------------------------------------------------------------------------------------
0004 ; ** 修改人: 李茂奎
0004 ; ** 版 本:
0004 ; ** 日 期:
0004 ; ** 描 述:
0004 ; **
0004 ; **--------------当前版本修订------------------------------------------------------------------------------
0004 ; ** 修改人: 李茂奎
0004 ; ** 日 期: 2006年9月2日
0004 ; ** 描 述:
0004 ; **
0004 ; **------------------------------------------------------------------------------------------------------
0004 ; *********************************************************************************************************/
0004 ; /*
0004 ; ATmega128的SPI采用硬件方式实现面向字节的全双工3线同步通信,
0004 ; 支持主机、从机和2种不同极性的SPI时序,通信速率有7种选择,
0004 ; 主机方式的最高速率为1/2系统时钟,从机方式最高速率为1/4系统时钟。
0004 ;
0004 ; AVR的SPI由一个16位的循环移位寄存器构成,当数据从主机方移出时,从机的数据同时也被移入,
0004 ; 因此SPI的发送和接收在一个中断服务中完成。
0004 ; 在SPI中断服务程序中,先从SPDR中读一个接收的字节存入接收数据缓冲器中,再从发送数据缓冲
0004 ; 器取出一个字节写入SPDR中,由SPI发送到从机。
0004 ; 数据一旦写入SPDR,ISP硬件开始发送数据。
0004 ; 下一次ISP中断时,表示发送完成,并同时收到一个数据。
0004 ; SPI为硬件接口和传输完成中断申请,所以使用SPI传输数据的有效方法是采用中断方式+数据缓存器的设计方法。
0004 ;
0004 ; 在对SPI初始化时,应注意以下几点:
0004 ; .正确选择和设置主机或从机,以及工作模式(极性),数据传输率;
0004 ; .注意传送字节的顺序,是低位优先(LSB First)还是高位优先(MSB Frist);
0004 ; .正确设置MOSI和MISO接口的输入输出方向,输入引脚使用上拉电阻,可以节省总线上的吊高电阻。
0004 ;
0004 ;
0004 ; */
0004 ; #include "config.h"
0004 ;
0004 ; static uint8 Spi_Receive_Data[SPI_RECEIVE_DATA_BUFFER_SIZE];
0004 ; static uint8 Spi_Send_Data[SPI_SEND_DATA_BUFFER_SIZE];
0004 ; CirQueue Spi_Receive_Buffer={0,0,0,Spi_Receive_Data,SPI_RECEIVE_DATA_BUFFER_SIZE,0,0,0};
0004 ; CirQueue Spi_Send_Buffer={0,0,0,Spi_Send_Data,SPI_SEND_DATA_BUFFER_SIZE,0,0,0};
0004 ;
0004 ; #pragma interrupt_handler spi_stc_isr:iv_SPI_STC
0004 ; void spi_stc_isr(void)
0004 ; {
0004 .dbline 64
0004 ; if(Spi_Receive_Buffer.status==SPI_DATA_RECEIVE)
0004 80910700 lds R24,_Spi_Receive_Buffer+7
0008 8130 cpi R24,1
000A 29F4 brne L8
000C .dbline 65
000C ; EnQueue(&Spi_Receive_Buffer,SPDR); //从SPI口读出收到的字节
000C 2FB1 in R18,0xf
000E 00E0 ldi R16,<_Spi_Receive_Buffer
0010 10E0 ldi R17,>_Spi_Receive_Buffer
0012 0E940000 xcall _EnQueue
0016 L8:
0016 .dbline 66
0016 ; if (Spi_Send_Buffer.status==SPI_DATA_SEND)
0016 80911000 lds R24,_Spi_Send_Buffer+7
001A 8230 cpi R24,2
001C 69F4 brne L11
001E .dbline 67
001E ; {
001E .dbline 68
001E ; if(!EmptyQueue(&Spi_Send_Buffer))//如果发送缓冲区中有待发的数据
001E 20900B00 lds R2,_Spi_Send_Buffer+2
0022 2220 tst R2
0024 31F0 breq L14
0026 .dbline 69
0026 ; {
0026 .dbline 70
0026 ; SPDR = DeQueue(&Spi_Send_Buffer); //发送一个字节数据,并调整指针
0026 00E0 ldi R16,<_Spi_Send_Buffer
0028 10E0 ldi R17,>_Spi_Send_Buffer
002A 0E940000 xcall _DeQueue
002E 0FB9 out 0xf,R16
0030 .dbline 71
0030 ; }
0030 03C0 xjmp L15
0032 L14:
0032 .dbline 73
0032 ; else
0032 ; {
0032 .dbline 74
0032 ; Spi_Send_Buffer.status=SPI_DATA_FREE;
0032 2224 clr R2
0034 20921000 sts _Spi_Send_Buffer+7,R2
0038 .dbline 75
0038 ; }
0038 L15:
0038 .dbline 76
0038 L11:
0038 .dbline -2
0038 L7:
0038 0E940000 xcall pop_lset
003C .dbline 0 ; func end
003C 1895 reti
003E .dbend
003E .dbfunc e Spi_Get_Char _Spi_Get_Char fc
003E ; data -> R20
.even
003E _Spi_Get_Char::
003E 0E940000 xcall push_gset1
0042 .dbline -1
0042 .dbline 82
0042 ; }
0042 ; }
0042 ;
0042 ;
0042 ;
0042 ; uint8 Spi_Get_Char(void)
0042 ; {
0042 L19:
0042 .dbline 84
0042 L20:
0042 .dbline 84
0042 ; uint8 data;
0042 ; while (EmptyQueue(&Spi_Receive_Buffer)); //无接收数据,等待
0042 20900200 lds R2,_Spi_Receive_Buffer+2
0046 2220 tst R2
0048 E1F3 breq L19
004A .dbline 85
004A ; data = DeQueue(&Spi_Receive_Buffer); //从接收缓冲区取出一个SPI收到的数据
004A 00E0 ldi R16,<_Spi_Receive_Buffer
004C 10E0 ldi R17,>_Spi_Receive_Buffer
004E 0E940000 xcall _DeQueue
0052 402F mov R20,R16
0054 .dbline 86
0054 ; return data;
0054 .dbline -2
0054 L18:
0054 0E940000 xcall pop_gset1
0058 .dbline 0 ; func end
0058 0895 ret
005A .dbsym r data 20 c
005A .dbend
005A .dbfunc e Spi_Put_Char _Spi_Put_Char fV
005A ; c -> R20
.even
005A _Spi_Put_Char::
005A 0E940000 xcall push_gset1
005E 402F mov R20,R16
0060 .dbline -1
0060 .dbline 90
0060 ; }
0060 ;
0060 ; void Spi_Put_Char(uint8 c)
0060 ; {
0060 L24:
0060 .dbline 91
0060 L25:
0060 .dbline 91
0060 ; while (FullQueue(&Spi_Send_Buffer));//发送缓冲区满,等待
0060 20900E00 lds R2,_Spi_Send_Buffer+5
0064 30900B00 lds R3,_Spi_Send_Buffer+2
0068 3214 cp R3,R2
006A D1F3 breq L24
006C .dbline 92
006C ; if (Spi_Send_Buffer.count)//发送缓冲区已中有待发数据
006C 3320 tst R3
006E 31F0 breq L29
0070 .dbline 93
0070 ; { //或SPI正在发送数据时
0070 .dbline 94
0070 ; EnQueue(&Spi_Send_Buffer,c);//将数据放入发送缓冲区排队
0070 242F mov R18,R20
0072 00E0 ldi R16,<_Spi_Send_Buffer
0074 10E0 ldi R17,>_Spi_Send_Buffer
0076 0E940000 xcall _EnQueue
007A .dbline 95
007A ; }
007A 01C0 xjmp L30
007C L29:
007C .dbline 97
007C 4FB9 out 0xf,R20
007E L30:
007E .dbline -2
007E L23:
007E 0E940000 xcall pop_gset1
0082 .dbline 0 ; func end
0082 0895 ret
0084 .dbsym r c 20 c
0084 .dbend
0084 .dbfunc e Spi_Receive _Spi_Receive fc
0084 ; i -> R20,R21
0084 ; length -> R22,R23
0084 ; buffer -> R10,R11
.even
0084 _Spi_Receive::
0084 0E940000 xcall push_gset3
0088 B901 movw R22,R18
008A 5801 movw R10,R16
008C .dbline -1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -