📄 i2c.lis
字号:
.module I2C.c
.area text(rom, con, rel)
0000 .dbfile G:\Mega8程序\TCXO评估板\Main\I2C.c
0000 .dbfunc e TWI_init _TWI_init fV
.even
0000 _TWI_init::
0000 .dbline -1
0000 .dbline 52
0000 ; #include<iom8v.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 ;
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 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 TestAck() (TWSR&0xf8)
0000 ; //TWSR--I2C状态寄存器,检查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 void delay_ms(unsigned int time);
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 53
0000 ; charState=EE_READ;
0000 80EF ldi R24,240
0002 80930000 sts _charState,R24
0006 .dbline 54
0006 ; TWBR=0x20;//波特率寄存器,正常情况下应不小于10
0006 80E2 ldi R24,32
0008 80B9 out 0x0,R24
000A .dbline 55
000A ; TWSR=0x00;//TWI状态寄存器,时钟分频值1
000A 2224 clr R2
000C 21B8 out 0x1,R2
000E .dbline -2
000E L1:
000E .dbline 0 ; func end
000E 0895 ret
0010 .dbend
.area vector(rom, abs)
.org 34
0022 08C0 rjmp _TWI_Ready
.area text(rom, con, rel)
0010 .dbfile G:\Mega8程序\TCXO评估板\Main\I2C.c
0010 .dbfunc e TWI_Ready _TWI_Ready fV
.even
0010 _TWI_Ready::
0010 2A92 st -y,R2
0012 0A93 st -y,R16
0014 1A93 st -y,R17
0016 8A93 st -y,R24
0018 9A93 st -y,R25
001A EA93 st -y,R30
001C 2FB6 in R2,0x3f
001E 2A92 st -y,R2
0020 .dbline -1
0020 .dbline 74
0020 ; }
0020 ;
0020 ; /**********************ATEEPROM读写过程*********************************
0020 ; 字节写:Start→器件地址&W→应答→选ROM地址→应答→写数据→应答→Stop
0020 ; 中断过程 START→MT_SLA_ACK→MT_DATA_ACK(地址)→MT_DATA_ACK(数据)(STOP中止)
0020 ;
0020 ; 页面写:Start→器件地址&W→应答→选ROM地址→应答→写数据→应答→写NEXT地址数据→应答→。。。写NEXT地址数据→应答→Stop
0020 ; 中断过程 START→MT_SLA_ACK→MT_DATA_ACK(地址)→MT_DATA_ACK(数据)→MT_DATA_ACK(数据)→。。。MT_DATA_ACK(数据)(STOP中止)
0020 ;
0020 ; 字节读:Start→器件地址&W→应答→选ROM地址→应答→Restart→器件地址&R→应答→读数据→无应答→Stop
0020 ; 中断过程 START→MT_SLA_ACK→MT_DATA_ACK(地址)→RE_START→MR_SLA_ACK→MR_DATA_NOACK(STOP中止)
0020 ;
0020 ; 页面读:Start→器件地址&W→应答→选ROM地址→应答→Restart→器件地址&R→应答→读数据→应答→读NEXT地址数据→应答→。。。读NEXT地址数据→无应答→Stop
0020 ; 中断过程 START→MT_SLA_ACK→MT_DATA_ACK(地址)→RE_START→MR_SLA_ACK→MR_DATA_ACK→MR_DATA_ACK→。。。MR_DATA_NOACK(STOP中止)
0020 ; *************************************************************************/
0020 ;
0020 ; #pragma interrupt_handler TWI_Ready:iv_TWI//TWI中断处理
0020 ; void TWI_Ready(void)
0020 ; {
0020 .dbline 75
0020 ; switch (TestAck())//检查状态标志字
0020 01B1 in R16,0x1
0022 1127 clr R17
0024 087F andi R16,248
0026 1070 andi R17,0
0028 0831 cpi R16,24
002A E0E0 ldi R30,0
002C 1E07 cpc R17,R30
002E 91F1 breq L8
0030 88E1 ldi R24,24
0032 90E0 ldi R25,0
0034 8017 cp R24,R16
0036 9107 cpc R25,R17
0038 74F0 brlt L21
003A L20:
003A 0830 cpi R16,8
003C E0E0 ldi R30,0
003E 1E07 cpc R17,R30
0040 F9F0 breq L6
0042 0830 cpi R16,8
0044 E0E0 ldi R30,0
0046 1E07 cpc R17,R30
0048 0CF4 brge X2
004A 5EC0 rjmp L3
004C X2:
004C L22:
004C 0031 cpi R16,16
004E E0E0 ldi R30,0
0050 1E07 cpc R17,R30
0052 D9F0 breq L7
0054 59C0 rjmp L3
0056 L21:
0056 0034 cpi R16,64
0058 E0E0 ldi R30,0
005A 1E07 cpc R17,R30
005C 09F4 brne X3
005E 48C0 rjmp L18
0060 X3:
0060 80E4 ldi R24,64
0062 90E0 ldi R25,0
0064 8017 cp R24,R16
0066 9107 cpc R25,R17
0068 2CF0 brlt L24
006A L23:
006A 0832 cpi R16,40
006C E0E0 ldi R30,0
006E 1E07 cpc R17,R30
0070 B9F0 breq L9
0072 4AC0 rjmp L3
0074 L24:
0074 0835 cpi R16,88
0076 E0E0 ldi R30,0
0078 1E07 cpc R17,R30
007A 09F4 brne X4
007C 3CC0 rjmp L19
007E X4:
007E 44C0 rjmp L3
0080 X0:
0080 .dbline 76
0080 ; {
0080 L6:
0080 .dbline 78
0080 ; case START:
0080 ; {
0080 .dbline 79
0080 ; TWItransmit(wr_device_add);
0080 .dbline 79
0080 80EA ldi R24,160
0082 83B9 out 0x3,R24
0084 .dbline 79
0084 85E8 ldi R24,133
0086 86BF out 0x36,R24
0088 .dbline 79
0088 .dbline 79
0088 .dbline 81
0088 ; //选取I2C从器件地址,进行主控写模式
0088 ; break;
0088 41C0 rjmp L4
008A L7:
008A .dbline 84
008A ; }
008A ; case RE_START:
008A ; {
008A .dbline 85
008A ; TWItransmit(rd_device_add);
008A .dbline 85
008A 81EA ldi R24,161
008C 83B9 out 0x3,R24
008E .dbline 85
008E 85E8 ldi R24,133
0090 86BF out 0x36,R24
0092 .dbline 85
0092 .dbline 85
0092 .dbline 87
0092 ; //选取I2C从器件地址,进行主控读模式
0092 ; break;
0092 3CC0 rjmp L4
0094 L8:
0094 .dbline 91
0094 ; }
0094 ; case MT_SLA_ACK:
0094 ; //Slave器件被识别并产生应答
0094 ; {
0094 .dbline 92
0094 ; TWItransmit(charAddr);
0094 .dbline 92
0094 20900100 lds R2,_charAddr
0098 23B8 out 0x3,R2
009A .dbline 92
009A 85E8 ldi R24,133
009C 86BF out 0x36,R24
009E .dbline 92
009E .dbline 92
009E .dbline 94
009E ; //写24C02ROM的字地址
009E ; break;
009E 36C0 rjmp L4
00A0 L9:
00A0 .dbline 98
00A0 ; }
00A0 ; case MT_DATA_ACK:
00A0 ; //主控发送数据,并得到响应
00A0 ; {
00A0 .dbline 99
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -