📄 sr.lst
字号:
008B F091 BEQ 0x009E
008C C011 RJMP 0x009E
(0194) {
(0195) //从机接收模式下的中断程序
(0196) case 0x60: TWCR=0xc5;break; // SLA+W已经接收,ACK已返回(从机被寻址,等待主机发送数据)
008D EC85 LDI R24,0xC5
008E BF86 OUT 0x36,R24
008F C00E RJMP 0x009E
(0197) case 0x80: receive_data = TWDR;TWCR=0xc5;break; // 数据已接收,ACK已返回(接收数据)
0090 B023 IN R2,0x03
0091 92200060 STS 0x60,R2
0093 EC85 LDI R24,0xC5
0094 BF86 OUT 0x36,R24
0095 C008 RJMP 0x009E
(0198) case 0x88: TWCR=0xc5;break; // 数据已接收,NOT ACK已返回(下一步:退出总线)
0096 EC85 LDI R24,0xC5
0097 BF86 OUT 0x36,R24
0098 C005 RJMP 0x009E
(0199) case 0xA0: TWCR=0xc5;break; // 接收到STOP或重复的START信号(停止接收数据)
0099 EC85 LDI R24,0xC5
009A BF86 OUT 0x36,R24
009B C002 RJMP 0x009E
(0200)
(0201) /* //主机接收模式下的中断程序
(0202) case 0x38: error_state=4;TWCR=0xc5;break; // SLA+R或NOT ACK仲裁失败(下一步:退出总线)
(0203) case 0x40: TWCR=0xc5; break; // SLA+R已发送,接收到ACK(从机被寻址,主机等待接收数据)
(0204) case 0x48: error_state=5;TWCR=0xc5;break; // SLA+R已发送,接收到NOT ACK(下一步:退出总线)
(0205) case 0x50: receive_data = TWDR;_NOP();_NOP();error_state=8;TWCR = 0xc4;break; // 接收到数据,ACK已返回(接收数据)
(0206) case 0x58: receive_data = TWDR;_NOP();_NOP();error_state=8;TWCR = 0xc4;break; // 接收到数据,NOT ACK已返回(下一步:退出总线)
(0207)
(0208) //从机发送模式
(0209) case 0xA8: TWDR= send_data;_NOP();_NOP();TWCR= 0x85; break; // SLA+R已接收,ACK已返回(从机被寻址,开送发送数据)
(0210) case 0xB8: TWCR= 0xc5;break; // TWDR里的数据已发送,接受到ACK(主机接收到数据,继续发送数据)
(0211) case 0xC0: TWCR= 0xc5;break; // TWDR里的数据已发送,接受到NOT ACK(下一步:退出总线)
(0212) case 0xC8: TWCR= 0xc5;break; // TWEA=0,接收到ACK(停止发送数据,退出发送)
(0213) */
(0214) //其他状态码
(0215) case 0xf8: break; // 等待或进行当前传输
(0216) case 0x00: TWCR= 0x95;break; // 非法的START或STOP引起的总线错误(释放总线)
009C E985 LDI R24,0x95
009D BF86 OUT 0x36,R24
(0217) default: break;
(0218) }
(0219) return receive_data; // 返回接收到的数据
009E 91000060 LDS R16,0x60
00A0 9029 LD R2,Y+
00A1 BE2F OUT 0x3F,R2
00A2 91E9 LD R30,Y+
00A3 9199 LD R25,Y+
00A4 9189 LD R24,Y+
00A5 9119 LD R17,Y+
00A6 9109 LD R16,Y+
00A7 9029 LD R2,Y+
00A8 9518 RETI
FILE: E:\iccavr\无线+I2C\test1--sr\twimain.c
(0001)
(0002) /*函数的使用说明:
(0003) 1.该twi模块包含四种工作模式,主发,主收,从收,从发,其中主发由
(0004) twiWriteByte(从机地址,要发送的数据)实现,主收由twiReadByte(从机地址)实现,从机
(0005) 的发送与接收均通过中断实现
(0006) 2.在从机模式下,需调用twi_init()来使能并初始化twi总线
(0007) 3.在主机模式下,调用twiWriteByte(从机地址,要发送的数据)向指定的从机写入数据,
(0008) 调用twiReadByte(从机地址)从指定的从机读取数据,然后可通过查询错误状态error_state
(0009) 的值决定下一步如何操作。
(0010) */
(0011)
(0012) #include "twi.h"
(0013)
(0014) //TWI同程序的接口参数
(0015) //receive_data,error_state不用设置
(0016) char receive_data=0; // 接收到的数据
(0017) char error_state=0; // twi错误状态
(0018) //以下三个参数根据需求进行设置
(0019) char slave_address=0xC0; // 设置从机地址,Bits 7..1:存放从机地址,Bit 0:最低位为广播识别使能位
(0020) char bit_race=0x20; // 设置主机模式的比特率,SCL=CPU频率/(16+2*(TWBR)*4TWPS),TWPS在4的指数位置
(0021) char send_data=0x02; // 从机发送模式下从机向主机发送的数据
(0022) //要发送的数据
(0023) char trandata[num] = {0x00,0x01,0x02,0x03};
(0024) //*************************** twi错误状态说明*********************************
(0025) // 0:twi传送无错误
(0026) // 1:在主发模式下,SLA+W已发送,返回NOT ACK
(0027) // 2:在主发模式下,DATA已发送,返回NOT ACK
(0028) // 3:在主发模式下,SLA+W或者数据的仲裁失败
(0029) // 4:在主收模式下,SLA+R或者数据的仲裁失败
(0030) // 5:在主收模式下,SLA+R已发送,返回NOT ACK
(0031) // 6:在主发模式下,START信号发送不成功
(0032) // 7:在主收模式下,START信号发送不成功
(0033) // 8:在主收模式下,数据接受完成
(0034) // 9:在主收模式下,数据接受不成功
(0035) //*****************************************************************************
(0036) //*************************** 延时1ms 程序 *************************************
(0037) //******************************************************************************
(0038) void Delay_1ms(void)
(0039) {
(0040) unsigned int i;
(0041) for(i = 0;i < (unsigned int)11 * 143 - 2;i ++);
_Delay_1ms:
i --> R16
00A9 2700 CLR R16
00AA 2711 CLR R17
00AB C002 RJMP 0x00AE
00AC 5F0F SUBI R16,0xFF
00AD 4F1F SBCI R17,0xFF
00AE 3203 CPI R16,0x23
00AF E0E6 LDI R30,6
00B0 071E CPC R17,R30
00B1 F3D0 BCS 0x00AC
(0042) }
00B2 9508 RET
_Delay_Nms:
j --> R20
i --> R22
00B3 D05F RCALL push_gset2
00B4 01B8 MOVW R22,R16
(0043) //*************************** 延时1s 程序 **************************************
(0044) //******************************************************************************
(0045) void Delay_Nms(unsigned int i)
(0046) {
(0047) unsigned int j;
(0048) for(j = 0;j < i;j ++)
00B5 2744 CLR R20
00B6 2755 CLR R21
00B7 C003 RJMP 0x00BB
(0049) Delay_1ms();
00B8 DFF0 RCALL _Delay_1ms
00B9 5F4F SUBI R20,0xFF
00BA 4F5F SBCI R21,0xFF
00BB 1746 CP R20,R22
00BC 0757 CPC R21,R23
00BD F3D0 BCS 0x00B8
(0050) }
00BE D03B RCALL pop_gset2
00BF 9508 RET
(0051) //*************************** I/O 初始化****************************************
(0052) //******************************************************************************
(0053) void port_init(void)
(0054) {
(0055) PORTB = 0x2f; //置PB0,PB1,PB2,PB3,PB5为1,PB4,PB6,PB7为0
_port_init:
00C0 E28F LDI R24,0x2F
00C1 BB88 OUT 0x18,R24
(0056) DDRB = 0x2f; //置PB0,PB1,PB2--SS,PB3--MOSI,PB5--SCK为输出,PB4--MISO为输入
00C2 BB87 OUT 0x17,R24
(0057) PORTC = 0x0f;
00C3 E08F LDI R24,0xF
00C4 BB85 OUT 0x15,R24
(0058) DDRC = 0x0f; //PC4--SDA,PC5--SCL为输入,PC0--PC3全为输出以便测试
00C5 BB84 OUT 0x14,R24
(0059) PORTD = 0x05; //置PWR,TXEN为1, TRXCE为0
00C6 E085 LDI R24,5
00C7 BB82 OUT 0x12,R24
(0060) DDRD = 0x07; //置PD3,PD4,PD5输入;PD2--PWR,PD0--TXEN,PD1--TRXCE输出
00C8 E087 LDI R24,7
00C9 BB81 OUT 0x11,R24
(0061) }
00CA 9508 RET
(0062) //******************************串口程序****************************************
(0063) //******************************************************************************
(0064) //UART0 initialize
(0065) // desired baud rate: 9600
(0066) // actual: baud rate:9600 (0.0%)
(0067) // char size: 8 bit
(0068) // parity: Disabled
(0069) void uart0_init(void)
(0070) {
(0071) UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
00CB 2422 CLR R2
00CC B82A OUT 0x0A,R2
(0072) UCSRA = 0x00;
00CD B82B OUT 0x0B,R2
(0073) UCSRC = BIT(URSEL) | 0x0E;
00CE E88E LDI R24,0x8E
00CF BD80 OUT 0x20,R24
(0074) UBRRL = 0x47; //set baud rate lo
00D0 E487 LDI R24,0x47
00D1 B989 OUT 0x09,R24
(0075) UBRRH = 0x00; //set baud rate hi
00D2 BC20 OUT 0x20,R2
(0076) UCSRB = 0x98;
00D3 E988 LDI R24,0x98
00D4 B98A OUT 0x0A,R24
(0077) }
00D5 9508 RET
(0078) //********************串口程序函数实现部分**************************************
(0079) //******************************************************************************
(0080) void USART_Transmit( unsigned char data )
(0081) {
(0082) while ( !( UCSRA & (1<<UDRE))); // 等待发送缓冲器为空
_USART_Transmit:
data --> R16
00D6 9B5D SBIS 0x0B,5
00D7 CFFE RJMP _USART_Transmit
(0083) UDR = data; // 将数据放入缓冲器,发送数据
00D8 B90C OUT 0x0C,R16
(0084) }
00D9 9508 RET
(0085)
(0086) #pragma interrupt_handler uart0_rx_isr:12
(0087) void uart0_rx_isr(void)
(0088) {
(0089) //uart has received a character in UDR
(0090) }
_uart0_rx_isr:
00DA 9518 RETI
(0091) //****************************** 初始化外围 ************************************
(0092) //******************************************************************************
(0093) void init_devices(void)
(0094) {
(0095) //stop errant interrupts until set up
(0096) CLI(); //disable all interrupts
_init_devices:
00DB 94F8 BCLR 7
(0097) port_init();
00DC DFE3 RCALL _port_init
(0098) uart0_init();
00DD DFED RCALL _uart0_init
(0099) MCUCR = 0x00;
00DE 2422 CLR R2
00DF BE25 OUT 0x35,R2
(0100) GICR = 0x00;
00E0 BE2B OUT 0x3B,R2
(0101) TIMSK = 0x00; //timer interrupt sources
00E1 BE29 OUT 0x39,R2
(0102) SEI(); //re-enable interrupts
00E2 9478 BSET 7
(0103) //all peripherals are now initialized
(0104) }
00E3 9508 RET
(0105) //****************************** 主函数 ***************************************
(0106) /*该程序工作于从收模式下,在基于中断的该模式下,cpu顺序接收来自主机的字符,并根
(0107) 据字符的值去置位PC0--PC3为低,PC0--PC3可以外接LED以显示操作的结果
(0108) */
(0109) //******************************************************************************
(0110) void main(void)
(0111) {
(0112) int i;
(0113) init_devices();
_main:
i --> Y+1
00E4 DFF6 RCALL _init_devices
(0114) Delay_Nms(2000);
00E5 ED00 LDI R16,0xD0
00E6 E017 LDI R17,7
00E7 DFCB RCALL _Delay_Nms
00E8 C00F RJMP 0x00F8
(0115) while(1)
(0116) {
(0117) if(receive_data == 0x00)
00E9 90200060 LDS R2,0x60
00EB 2022 TST R2
00EC F411 BNE 0x00EF
(0118) {
(0119) PORTC &= ~BIT(PC0);
00ED 98A8 CBI 0x15,0
(0120) }
00EE C009 RJMP 0x00F8
(0121) else if(receive_data == 0x01)
00EF 91800060 LDS R24,0x60
00F1 3081 CPI R24,1
00F2 F411 BNE 0x00F5
(0122) {
(0123) PORTC &= ~BIT(PC1);
00F3 98A9 CBI 0x15,1
(0124) }
00F4 C003 RJMP 0x00F8
(0125) else
(0126) PORTC |= 0X0f;
00F5 B385 IN R24,0x15
00F6 608F ORI R24,0xF
00F7 BB85 OUT 0x15,R24
00F8 CFF0 RJMP 0x00E9
(0127)
(0128)
(0129) /* for(i = 0 ; i < num ; i ++)
(0130) {
(0131) USART_Transmit( receive_data ) //给下位机发送接收到的数据,
(0132) Delay_1ms();
(0133) }*/
(0134) }
(0135) }
FILE: <library>
00F9 9508 RET
pop_gset2:
00FA E0E2 LDI R30,2
00FB C004 RJMP pop
push_gset1:
00FC 935A ST R21,-Y
00FD 934A ST R20,-Y
00FE 9508 RET
pop_gset1:
00FF E0E1 LDI R30,1
pop:
0100 9149 LD R20,Y+
0101 9159 LD R21,Y+
0102 FDE0 SBRC R30,0
0103 9508 RET
0104 9169 LD R22,Y+
0105 9179 LD R23,Y+
0106 FDE1 SBRC R30,1
0107 9508 RET
0108 90A9 LD R10,Y+
0109 90B9 LD R11,Y+
010A FDE2 SBRC R30,2
010B 9508 RET
010C 90C9 LD R12,Y+
010D 90D9 LD R13,Y+
010E FDE3 SBRC R30,3
010F 9508 RET
0110 90E9 LD R14,Y+
0111 90F9 LD R15,Y+
0112 9508 RET
push_gset2:
0113 937A ST R23,-Y
0114 936A ST R22,-Y
0115 CFE6 RJMP push_gset1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -