📄 i2c.lis
字号:
.module I2C.c
.area text(rom, con, rel)
0000 .dbfile G:\Mega8程序\TCXO评估板\LedShow\I2C.c
0000 .dbfunc e TWI_init _TWI_init fV
.even
0000 _TWI_init::
0000 .dbline -1
0000 .dbline 79
0000 ; /*******************************************************
0000 ; 本部分为TWI总线的被控器部分程序,可以完成被控接收、被控发送数据
0000 ; 其工作方式与At240×系列的EEPROM的字节读写相同
0000 ; 目前问题是EEPROM的读写速度太慢,无法跟上TWI总线速度。
0000 ; *///////////////////////////////////////////////////////
0000 ;
0000 ; #include<iom8v.h>
0000 ; #include <macros.h>
0000 ; /* AT2402C地址
0000 ; 1 0 1 0 A2 A1 A0 R/W
0000 ; 前4位为AT240X系列的特征字
0000 ; 后3位为可编程位
0000 ; 最后一位为读写位
0000 ; */
0000 ; #define rd_device_add 0xa1 //读地址:0b10100001
0000 ; #define wr_device_add 0xa0 //写地址:0b10100000
0000 ;
0000 ; /*TWI状态定义----MT 主方式传输 MR 主方式接收*/
0000 ; #define START 0x08
0000 ; #define RE_START 0x10
0000 ;
0000 ; #define MT_SLA_ACK 0x18
0000 ; #define MT_SLA_NOACK 0x20
0000 ; #define MT_DATA_ACK 0x28
0000 ; #define MT_DATA_NOACK 0x30
0000 ;
0000 ; #define MR_SLA_ACK 0x40
0000 ; #define MR_SLA_NOACK 0x48
0000 ; #define MR_DATA_ACK 0x50
0000 ; #define MR_DATA_NOACK 0x58
0000 ;
0000 ; //SR-从机方式接收 ST-从机方式传输 ALL-广播 NOCTRL-主机丢失控制权
0000 ; #define SR_SLA_ACK 0x60
0000 ; #define SR_SLA_ACK_NOCTRL 0x68
0000 ; #define SR_ALL_ACK 0x70
0000 ; #define SR_ALL_ACK_NOCTRL 0x78
0000 ; #define SR_DATA_ACK 0X80
0000 ; #define SR_DATA_NOACK 0X88
0000 ; #define SR_ALL_DATA_ACK 0x90
0000 ; #define SR_ALL_DATA_NOACK 0x98
0000 ; #define SR_STOP_RESTART 0xa0
0000 ;
0000 ; #define ST_SLA_ACK 0xa8
0000 ; #define ST_SLA_ACK_NOCTRL 0xb0
0000 ; #define ST_DATA_ACK 0xb8
0000 ; #define ST_DATA_NOACK 0xc0
0000 ; #define ST_LAST_DATA_ACK 0xc8
0000 ;
0000 ; ///////////////////////////////////////////////////////////
0000 ; #define EE_READ 0xf0
0000 ; #define EE_READ_OK 0x50
0000 ; #define EE_WRITE 0x0f
0000 ; #define EE_WRITE_OK 0x05
0000 ; #define EE_WRITE_OVER 0xa5
0000 ;
0000 ; #define TestAck() (TWSR&0xf8)
0000 ; //TWSR--I2C状态寄存器,检查TWI状态,应该将预分频位屏蔽(第三位是保留位)
0000 ;
0000 ; #define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE))
0000 ; //清除中断标志位,在总线上发出起始信号,激活TWI功能,开放TWI中断
0000 ; #define Stop() (TWCR=((1<<TWINT)|(1<<TWSTO)|(1<<TWEN))&(~(1<<TWIE)))
0000 ; //清除中断标志位,在总线上发出终止信号,激活TWI功能,关闭TWI中断
0000 ; #define MT_NACK (TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWIE))
0000 ; //清除中断标志位,使能TWI功能,开放TWI中断,在主控接收状态下不对SDA线作应答
0000 ; #define MT_ACK (TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWIE)|(1<<TWEA))
0000 ; //清除中断标志位,使能TWI功能,开放TWI中断,在主控接收状态下对SDA线作应答
0000 ; #define TWItransmit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWIE);}
0000 ; //写入8位数据到数据寄存器中,同时清除中断标志位,使能TWI功能,开放TWI中断
0000 ;
0000 ; extern char cDataBuff[];
0000 ; extern void rom_write(unsigned int Address,unsigned char Data);
0000 ; extern unsigned char rom_read(unsigned int Address);
0000 ;
0000 ; unsigned char charData;//TWI中断中,传送的数据
0000 ; unsigned char charAddr;//TWI中断中,数据所处的EEPROM地址
0000 ; unsigned char charState;//TWI中断中,中断所处的状态
0000 ;
0000 ; void TWI_init(void)
0000 ; {
0000 .dbline 80
0000 ; DDRC&=0b11001111;//设置PC4、PC5为输入
0000 84B3 in R24,0x14
0002 8F7C andi R24,207
0004 84BB out 0x14,R24
0006 .dbline 81
0006 ; PORTC|=0b00110000;//将SDA、SCL线拉高(内置上拉电阻)
0006 85B3 in R24,0x15
0008 8063 ori R24,48
000A 85BB out 0x15,R24
000C .dbline 82
000C ; charState=EE_READ;
000C 80EF ldi R24,240
000E 80930000 sts _charState,R24
0012 .dbline 83
0012 ; TWBR=0x00;//波特率寄存器,主机正常情况下应不小于10
0012 2224 clr R2
0014 20B8 out 0x0,R2
0016 .dbline 84
0016 ; TWSR=0x00;//TWI状态寄存器,时钟分频值1
0016 21B8 out 0x1,R2
0018 .dbline 85
0018 ; TWAR=0xa0;/*被控器地址寄存器。0xa0为AT2402的地址,可以用ATMEGA8来模拟AT2402。
0018 80EA ldi R24,160
001A 82B9 out 0x2,R24
001C .dbline 87
001C ; 作为从机,应该将被控器的地址写入。注意不要和其他器件相同*/
001C ; TWCR=(TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWIE)|(1<<TWEA));//清除中断标志位,使能TWI功能,开放TWI中断
001C 85EC ldi R24,197
001E 86BF out 0x36,R24
0020 86BF out 0x36,R24
0022 .dbline -2
0022 L1:
0022 .dbline 0 ; func end
0022 0895 ret
0024 .dbend
.area vector(rom, abs)
.org 34
0022 12C0 rjmp _TWI_Ready
.area text(rom, con, rel)
0024 .dbfile G:\Mega8程序\TCXO评估板\LedShow\I2C.c
.area data(ram, con, rel)
0000 .dbfile G:\Mega8程序\TCXO评估板\LedShow\I2C.c
0000 L3:
0000 .blkb 1
.area idata
0000 00 .byte 0
.area data(ram, con, rel)
0001 .dbfile G:\Mega8程序\TCXO评估板\LedShow\I2C.c
.area text(rom, con, rel)
0024 .dbfile G:\Mega8程序\TCXO评估板\LedShow\I2C.c
0024 .dbfunc e TWI_Ready _TWI_Ready fV
0024 .dbsym s charIndex L3 c
0024 ; charTemp -> R20
0024 ; TWI_STATE -> R22
.even
0024 _TWI_Ready::
0024 2A92 st -y,R2
0026 3A92 st -y,R3
0028 0A93 st -y,R16
002A 1A93 st -y,R17
002C 8A93 st -y,R24
002E 9A93 st -y,R25
0030 EA93 st -y,R30
0032 FA93 st -y,R31
0034 2FB6 in R2,0x3f
0036 2A92 st -y,R2
0038 00D0 rcall push_gset2
003A .dbline -1
003A .dbline 91
003A ; }
003A ; #pragma interrupt_handler TWI_Ready:iv_TWI//TWI中断处理
003A ; void TWI_Ready(void)
003A ; {
003A .dbline 95
003A ; static unsigned char charIndex=0;
003A ; unsigned char charTemp;
003A ; unsigned char TWI_STATE;
003A ; TWI_STATE=TestAck();
003A 61B1 in R22,0x1
003C 687F andi R22,248
003E .dbline 96
003E ; switch (TWI_STATE)//检查状态标志字
003E 462F mov R20,R22
0040 5527 clr R21
0042 403A cpi R20,160
0044 E0E0 ldi R30,0
0046 5E07 cpc R21,R30
0048 09F4 brne X2
004A 03C1 rjmp L15
004C X2:
004C 80EA ldi R24,160
004E 90E0 ldi R25,0
0050 8417 cp R24,R20
0052 9507 cpc R25,R21
0054 74F0 brlt L20
0056 L19:
0056 4036 cpi R20,96
0058 E0E0 ldi R30,0
005A 5E07 cpc R21,R30
005C 01F1 breq L7
005E 4036 cpi R20,96
0060 E0E0 ldi R30,0
0062 5E07 cpc R21,R30
0064 0CF4 brge X3
0066 11C1 rjmp L4
0068 X3:
0068 L21:
0068 4038 cpi R20,128
006A E0E0 ldi R30,0
006C 5E07 cpc R21,R30
006E D1F0 breq L8
0070 0CC1 rjmp L4
0072 L20:
0072 483B cpi R20,184
0074 E0E0 ldi R30,0
0076 5E07 cpc R21,R30
0078 09F4 brne X4
007A F3C0 rjmp L17
007C X4:
007C 88EB ldi R24,184
007E 90E0 ldi R25,0
0080 8417 cp R24,R20
0082 9507 cpc R25,R21
0084 34F0 brlt L23
0086 L22:
0086 483A cpi R20,168
0088 E0E0 ldi R30,0
008A 5E07 cpc R21,R30
008C 09F4 brne X5
008E E4C0 rjmp L16
0090 X5:
0090 FCC0 rjmp L4
0092 L23:
0092 403C cpi R20,192
0094 E0E0 ldi R30,0
0096 5E07 cpc R21,R30
0098 09F4 brne X6
009A F4C0 rjmp L18
009C X6:
009C F6C0 rjmp L4
009E X0:
009E .dbline 97
009E ; {
009E L7:
009E .dbline 99
009E ; case SR_SLA_ACK:
009E ; {
009E .dbline 100
009E ; MT_ACK;
009E 85EC ldi R24,197
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -