⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.lis

📁 详细介绍M8两版间通讯
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .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 + -