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

📄 i2c.lis

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