📄 twi.lis
字号:
.module TWI.c
.area data(ram, con, rel)
0000 _Twi_SendBuffer::
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 0F00 .word _Twi_SendData
.area data(ram, con, rel)
0005 .blkb 1
.area idata
0005 05 .byte 5
.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\TWI\TWI.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 Twi_SendBuffer _Twi_SendBuffer S[.1]
0009 _Twi_ReceiveBuffer::
0009 .blkb 1
.area idata
0009 00 .byte 0
.area data(ram, con, rel)
000A .dbfile D:\桌面\mp3\TWI\TWI.c
000A .blkb 1
.area idata
000A 00 .byte 0
.area data(ram, con, rel)
000B .dbfile D:\桌面\mp3\TWI\TWI.c
000B .blkb 1
.area idata
000B 00 .byte 0
.area data(ram, con, rel)
000C .dbfile D:\桌面\mp3\TWI\TWI.c
000C .blkw 1
.area idata
000C 0A00 .word _Twi_ReceiveData
.area data(ram, con, rel)
000E .dbfile D:\桌面\mp3\TWI\TWI.c
000E .blkb 1
.area idata
000E 05 .byte 5
.area data(ram, con, rel)
000F .dbfile D:\桌面\mp3\TWI\TWI.c
000F .blkb 1
.area idata
000F 00 .byte 0
.area data(ram, con, rel)
0010 .dbfile D:\桌面\mp3\TWI\TWI.c
0010 .blkb 1
.area idata
0010 00 .byte 0
.area data(ram, con, rel)
0011 .dbfile D:\桌面\mp3\TWI\TWI.c
0011 .blkb 1
.area idata
0011 00 .byte 0
.area data(ram, con, rel)
0012 .dbfile D:\桌面\mp3\TWI\TWI.c
0012 .dbsym e Twi_ReceiveBuffer _Twi_ReceiveBuffer S[.1]
0012 _Twi_LocalBuffer::
0012 .blkb 1
.area idata
0012 00 .byte 0
.area data(ram, con, rel)
0013 .dbfile D:\桌面\mp3\TWI\TWI.c
0013 .blkb 1
.area idata
0013 00 .byte 0
.area data(ram, con, rel)
0014 .dbfile D:\桌面\mp3\TWI\TWI.c
0014 .blkb 1
.area idata
0014 00 .byte 0
.area data(ram, con, rel)
0015 .dbfile D:\桌面\mp3\TWI\TWI.c
0015 .blkw 1
.area idata
0015 0500 .word _LocalBuffer
.area data(ram, con, rel)
0017 .dbfile D:\桌面\mp3\TWI\TWI.c
0017 .blkb 1
.area idata
0017 05 .byte 5
.area data(ram, con, rel)
0018 .dbfile D:\桌面\mp3\TWI\TWI.c
0018 .blkb 1
.area idata
0018 00 .byte 0
.area data(ram, con, rel)
0019 .dbfile D:\桌面\mp3\TWI\TWI.c
0019 .blkb 1
.area idata
0019 00 .byte 0
.area data(ram, con, rel)
001A .dbfile D:\桌面\mp3\TWI\TWI.c
001A .blkb 1
.area idata
001A 00 .byte 0
.area data(ram, con, rel)
001B .dbfile D:\桌面\mp3\TWI\TWI.c
001B .dbsym e Twi_LocalBuffer _Twi_LocalBuffer S[.1]
.area text(rom, con, rel)
0000 .dbfile D:\桌面\mp3\TWI\TWI.c
0000 .dbfunc e Delay _Delay fV
0000 ; i -> R20
0000 ; n -> R16
.even
0000 _Delay::
0000 0E940000 xcall push_gset1
0004 .dbline -1
0004 .dbline 92
0004 ; /*********************************************************************************************************
0004 ; ** TWI 驱动程序
0004 ; ** (c) Copyright 2006-2008, limaokui
0004 ; ** All Rights Reserved
0004 ; **
0004 ; ** V1.0.0
0004 ; **
0004 ; **
0004 ; **--------------文件信息--------------------------------------------------------------------------------
0004 ; **文 件 名:TWI.h
0004 ; **创 建 人: 李茂奎
0004 ; **最后修改日期: 2006年8月29日
0004 ; **描 述: TWI驱动程序
0004 ; **
0004 ; **--------------历史版本信息----------------------------------------------------------------------------
0004 ; ** 创建人: 李茂奎
0004 ; ** 版 本: V1.00
0004 ; ** 日 期: 2006年8月29日
0004 ; ** 描 述: 原始版本
0004 ; **
0004 ; **------------------------------------------------------------------------------------------------------
0004 ; ** 修改人: 李茂奎
0004 ; ** 版 本:
0004 ; ** 日 期:
0004 ; ** 描 述:
0004 ; **
0004 ; **--------------当前版本修订------------------------------------------------------------------------------
0004 ; ** 修改人: 李茂奎
0004 ; ** 日 期: 2006年9月1日
0004 ; ** 描 述:
0004 ; **
0004 ; **------------------------------------------------------------------------------------------------------
0004 ; *********************************************************************************************************/
0004 ; /*
0004 ; 说明:1、本驱动程序已经实现了TWI中断通讯的四种模式:MT、MR、ST、SR。
0004 ; 2、MT方式调用Twi_MasterSend()函数,用到了Twi_SendBuffer队列,
0004 ; 最大单次发送255Btye,理论上两次发送间隔5MS以上。
0004 ; 3、MR方式调用Twi_MasterRecive()函数,用到了Twi_ReceiveBuffer队列,
0004 ; 最大单次发送255Btye,理论上两次发送间隔5MS以上。
0004 ; 4、SR方式用户不必关心何时中断,在中断结束后,调用Twi_SlaveReceiveService()函数,
0004 ; 此函数将接收到的数据传给上层缓冲区Twi_LocalBuffer,用到了Twi_ReceiveBuffer、Twi_LocalBuffer队列,
0004 ; 最大单次发送255Btye。上层程序仅需检测Twi_LocalBuffer中的status即可,即若status值
0004 ; TWI_DATA_READY,就可以读取数据,读完后设置LocalBuffer的Status为TWI_DATA_FREE。
0004 ; 5、ST方式用户不必关心何时中断,在中断结束后,调用Twi_TransmintReceiveService()函数S玫搅薚wi_ReceiveBuffer、Twi_LocalBuffer队列,
0004 ; 如果想使能从机发送则可将要发数据传入LocalBuffer中并设置Status为TWI_DATA_SEND,在写
0004 ; LocalBuffer之前,应检测STATUS是否为Status为TWI_DATA_FREE。
0004 ; 6、非中断模式的接收发送没有经过验证。使用时请注意。
0004 ; 7、使用时首先调用TwiInit()进行初始化,(循环队列的长度可以自己修改对应的数组和结构中的queuesize),
0004 ; 然后打开中断即可。对于不同的单片机,此驱动中通过定义CPU_TYPE实现切换。对应的定义在config中。
0004 ; */
0004 ; #include "config.h"
0004 ; // Twi标准波特率:
0004 ; // 低速 100KHz
0004 ; // 高速 400KHz
0004 ;
0004 ; // Twi_ 状态和地址变量
0004 ; static volatile eTwi_StateType Twi_State; // 用于独占TWI的资源分配的信号量机制
0004 ; static volatile uint8 Twi_DeviceAddrRW;
0004 ; // 发送缓冲区
0004 ; static uint8 Twi_SendData[TWI_SEND_DATA_BUFFER_SIZE];
0004 ; CirQueue Twi_SendBuffer={0,0,0,Twi_SendData,TWI_SEND_DATA_BUFFER_SIZE,QUEUE_OK,TWI_DATA_FREE,0};
0004 ; // 接收缓冲区
0004 ; static uint8 Twi_ReceiveData[TWI_RECEIVE_DATA_BUFFER_SIZE];
0004 ; CirQueue Twi_ReceiveBuffer={0,0,0,(uint8 *)Twi_ReceiveData,TWI_RECEIVE_DATA_BUFFER_SIZE,QUEUE_OK,TWI_DATA_FREE,0};
0004 ; //本地缓冲区,当为从机时,与TWI接口
0004 ; static uint8 LocalBuffer[TWI_LOCAL_DATA_BUFFER_SIZE];
0004 ; CirQueue Twi_LocalBuffer={0,0,0,LocalBuffer,TWI_LOCAL_DATA_BUFFER_SIZE,QUEUE_OK,TWI_DATA_FREE,0};
0004 ; //错误代码
0004 ; static volatile uint8 TwiErrorCode;
0004 ;
0004 ; // 指向接收处理函数的指针,当本机被选中从接收时调用函数:Twi_SlaveReceive
0004 ; static void (*Twi_SlaveReceive)(uint8 receiveDataLength, uint8* recieveData);
0004 ; // 指向发送处理函数的指针,当本机被选中从发送时调用函数:ITwi_SlaveTransmit
0004 ; static uint8 (*Twi_SlaveTransmit)(uint8 transmitDataLengthMax, uint8* transmitData);
0004 ;
0004 ;
0004 ;
0004 ; /*************************************************************************************
0004 ; **延时公式
0004 ; ** i*500-100 US (8>i>2)
0004 ; ** i*500 (255>i>8)
0004 ; ** i=1精确延时100us
0004 ; ** i=2 精确延时660US
0004 ; ** i=6 精确延时2.9ms
0004 ; ** i=10 精确延时5ms
0004 ; ** i=20 10ms
0004 ; ** i=100 50ms
0004 ; ** i=200 100ms
0004 ; ** i=255 128ms
0004 ; **************************************************************************************/
0004 ; void Delay(uint8 n)
0004 ; {
0004 .dbline 94
0004 ; uint8 i;
0004 ; for(i=36;n!=0;n--)
0004 44E2 ldi R20,36
0006 07C0 xjmp L11
0008 X0:
0008 .dbline 95
0008 ; {
0008 L12:
0008 .dbline 96
0008 L13:
0008 .dbline 96
0008 842F mov R24,R20
000A 8150 subi R24,1
000C 482F mov R20,R24
000E 8823 tst R24
0010 D9F7 brne L12
0012 .dbline 97
0012 A895 wdr
0014 .dbline 98
0014 L9:
0014 .dbline 94
0014 0A95 dec R16
0016 L11:
0016 .dbline 94
0016 0023 tst R16
0018 B9F7 brne L13
001A .dbline -2
001A L7:
001A 0E940000 xcall pop_gset1
001E .dbline 0 ; func end
001E 0895 ret
0020 .dbsym r i 20 c
0020 .dbsym r n 16 c
0020 .dbend
0020 .dbfunc e Twi_SetBitrate _Twi_SetBitrate fV
0020 ; bitrate_div -> R10
0020 ; bitrateKHz -> R10,R11
.even
0020 _Twi_SetBitrate::
0020 0E940000 xcall push_gset3
0024 5801 movw R10,R16
0026 .dbline -1
0026 .dbline 111
0026 ; while(--i);
0026 ; WDR(); //喂狗;
0026 ; }
0026 ; }
0026 ; /*********************************************************************************************************
0026 ; ** 函数名称:Twi_SetBitrate
0026 ; ** 功能描述:设置TWI总线的速率
0026 ; ** 输 入: bitrateKHZ : 总线速率
0026 ; ** 输 出:
0026 ; ** 全局变量:
0026 ; ** 调用模块: 无
0026 ; ** 说明:
0026 ; ** 注意:
0026 ; ** 日 期: 2006年8月29日
0026 ; ********************************************************************************************************/
0026 ; void Twi_SetBitrate(uint16 bitrateKHz){
0026 .dbline 113
0026 ; uint8 bitrate_div;
0026 ; WDR(); //喂狗;
0026 A895 wdr
0028 .dbline 119
0028 ; // SCL freq = F_CPU/(16+2*TWBR))
0028 ; #ifdef TWPS0
0028 ; // 对于用速率分频的AVR (mega128)
0028 ; // SCL freq = F_CPU/(16+2*TWBR*4^TWPS)
0028 ; // set TWPS to zero
0028 ; TWSR&=~(1<<TWPS0);
0028 0898 cbi 0x1,0
002A .dbline 120
002A ; TWSR&=~(1<<TWPS1);
002A 0998 cbi 0x1,1
002C .dbline 123
002C ; #endif
002C ; // 计算分频
002C ; bitrate_div = ((F_CPU/1000)/bitrateKHz);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -