|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
高手指點(diǎn)一下mega8的I2C,不勝感激 |
| 作者:cpldx 欄目:單片機(jī) |
為什么I2C置標(biāo)志置位進(jìn)不了中斷,定時(shí)器,外中斷都可以,是我弄錯(cuò)了,還是怎么回事,煩請(qǐng)高手指點(diǎn),以及其注意事項(xiàng),謝謝 |
| 2樓: | >>參與討論 |
| 作者: david1234 于 2004/4/15 19:19:00 發(fā)布:
slaver or MASTER? |
|
| 3樓: | >>參與討論 |
| 作者: cpldx 于 2004/4/16 8:42:00 發(fā)布:
都是這樣啊 ldi TEMP,0x20 ;設(shè)置波特率 out TWBR,TEMP ldi TEMP,0x00 out TWSR,TEMP 主機(jī),我用查詢方式 ldi r16, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN) out TWCR, r16 wait1: in r16,TWCR sbrs r16,TWINT rjmp wait1 in r16,TWSR andi r16, 0xF8 cpi r16, 0x08 brne ERROR ldi r16, 0x02 out TWDR, r16 ldi r16, (1<<TWINT) | (1<<TWEN) out TWCR, r16 wait2: in r16,TWCR sbrs r16,TWINT rjmp wait2 in r16,TWSR andi r16, 0xF8 cpi r16, 0x18 brne ERROR ldi r16, 0xff out TWDR, r16 ldi r16, (1<<TWINT) | (1<<TWEN) out TWCR, r16 wait3: in r16,TWCR sbrs r16,TWINT rjmp wait3 in r16,TWSR andi r16, 0xF8 cpi r16, 0x28 brne ERROR ldi r16, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO) out TWCR, r16 error: rjmp error 從機(jī)中斷 ldi TEMP,SLA ;從機(jī)地址 out TWAR,TEMP ldi TEMP,(1<<TWEN)|(1<<TWIE)|(TWEA);開(kāi)I2中斷 out TWCR,TEMP sei wait1: sbrs bvalid,0 rjmp wait1 clr bvalid tt: rjmp tt I2int: cbi PORTB,0 kk: rjmp kk in TEMP,TWSR ;檢測(cè)TWI狀態(tài)寄存器TWSR,屏蔽預(yù)分頻位 andi TEMP,0xf8 cpi TEMP,0x60 ;如果不是SLA+W轉(zhuǎn)移 brne end ldi TEMP,(1<<TWINT)|(1<<TWEA) out TWCR,TEMP wait2: in TEMP,TWCR sbrs TEMP,TWINT rjmp wait2 ;等待TWINT置位 in TEMP,TWSR andi TEMP,0xf8 cpi TEMP,0x88 ;如果不是SLA+W尋址,DATA已經(jīng)收到,NACK已經(jīng)發(fā)出,轉(zhuǎn)移 brne end in MOrder,TWDR ;讀出主機(jī)命令 clr TEMP out TWCR,TEMP ldi TEMP,Time1_scaler ;開(kāi)定時(shí)器 out TCCR1B,TEMP ldi TEMP,(1<<TWINT)|(1<<TWEA)|(1<<TWEN);轉(zhuǎn)入被控初始狀態(tài),進(jìn)行本機(jī)SLA匹配 out TWCR,TEMP wait3: in TEMP,TWCR sbrs TEMP,TWINT rjmp wait3 in TEMP,TWSR andi TEMP,0xf8 cpi TEMP,0xa8 ;收到本機(jī)SLA+R,ACK已經(jīng)發(fā)出 brne end out TWDR,MOrder ;發(fā)送剛剛受到的命令 ldi TEMP,(1<<TWINT)|(1<<TWEN);發(fā)送最后一個(gè)DATA,接收NACK信號(hào) out TWCR,TEMP wait4: in TEMP,TWCR sbrs TEMP,TWINT rjmp wait4 in TEMP,TWSR andi TEMP,0xf8 cpi TEMP,0xc0 ;如果不是DATA已經(jīng)發(fā)出,受到NACK信號(hào),轉(zhuǎn)移 brne end ldi TEMP,(1<<TWINT)|(1<<TWEA);轉(zhuǎn)入被控初始狀態(tài),進(jìn)行本機(jī)SLA匹配 out TWCR,TEMP call delay wait5: sbic PINB,OK ;等待主機(jī)應(yīng)答信號(hào) rjmp wait5 cbi PORTB,Answer ;應(yīng)答主機(jī) call delay sbi PORTB,Answer sbr bvalid,0x01 end: clr TEMP out TWCR,TEMP reti 開(kāi)始我主機(jī)也是用的中斷,不行,我又改為查詢方式 還是不行,資料上都說(shuō)寫1清TWINT,但是我用軟件 仿真是清不掉的,怎么回事?? |
|
| 4樓: | >>參與討論 |
| 作者: david1234 于 2004/4/16 14:17:00 發(fā)布:
這是我從程序中拷出來(lái)的,實(shí)際中肯定能用 ; *** Init I2C *** outi twbr,(ck-16*sclk)/(2*sclk) ; i2c clock .equ START = 0x8 .equ MT_SLA_ACK = 0x18 .equ MT_DATA_ACK = 0x28 .equ MR_SLA_ACK = 0x40 .equ MR_DATA_ACK = 0x50 .equ MR_DATA_NACK = 0x58 ;************************************ ; i2c write, write a string ; entry: iicadd, iicnumber-- numbers to be write, X-- data pointer ; exit: c=0 ok; c=1 failed ;*********************************** i2cwr: outi TWCR,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) ; i2c start in r16,TWCR sbrs r16,TWINT rjmp pc-2 ; waite in r16,TWSR andi r16,0xf8 ; mask prescale bits cpi r16,START ; if start? brne error out TWDR,iicadd ; write i2c DEVICE address sts lastadd,iicadd cbi TWDR,0 ; i2c write outi TWCR,(1<<TWINT)|(1<<TWEN) ; in r16,TWCR sbrs r16,TWINT rjmp pc-2 ; waite in r16,TWSR andi r16,0xf8 ; mask prescale bits cpi r16,MT_SLA_ACK ; if address ack? brne error i2cwr_lp: ld r16,x+ ; get data out TWDR,r16 outi TWCR,(1<<TWINT)|(1<<TWEN) ; in r16,TWCR sbrs r16,TWINT rjmp pc-2 ; waite in r16,TWSR andi r16,0xf8 ; mask prescale bits cpi r16,MT_DATA_ACK ; if data ack? brne error dec iicnumber brne i2cwr_lp outi TWCR,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN) ; i2c stop clc ret error: sec ret ;********************************************* ; i2c read, ONLY read one byte ; entry: iicadd ; exit: r16--data, c=0 ok; c=1 failed ;********************************************* i2crd: outi TWCR,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) ; i2c start in r16,TWCR sbrs r16,TWINT rjmp pc-2 ; waite in r16,TWSR andi r16,0xf8 ; mask prescale bits cpi r16,START ; if start? brne error out TWDR,iicadd ; write i2c DEVICE address sbi TWDR,0 ; i2c read outi TWCR,(1<<TWINT)|(1<<TWEN) ; in r16,TWCR sbrs r16,TWINT rjmp pc-2 ; waite in r16,TWSR andi r16,0xf8 ; mask prescale bits cpi r16,MR_SLA_ACK ; if address ack? brne error outi TWCR,(1<<TWINT)|(1<<TWEN) ; in r16,TWCR sbrs r16,TWINT rjmp pc-2 ; waite in r16,TWSR andi r16,0xf8 ; mask prescale bits cpi r16,MR_DATA_NACK ; if final data? brne error in r16,TWDR PUSH r16 outi TWCR,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN) ; i2c stop pop r16 clc ret |
|
| 5樓: | >>參與討論 |
| 作者: david1234 于 2004/4/16 14:21:00 發(fā)布:
補(bǔ)充一下OUTI的宏定義: ; OUTPUT immediate ; ; outi PORT,var .macro outi ldi r16,@1 out @0,r16 .endm |
|
| 6樓: | >>參與討論 |
| 作者: cpldx 于 2004/4/20 11:53:00 發(fā)布:
多謝指點(diǎn),問(wèn)題已經(jīng)搞定 |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |