Исходник вижу. Счас буду искать. Вот мой для PIC:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Сергей Борщ 23 июля 2004 г. 13:24
В ответ на: ТУФТУ ГОНИТЕ. У меня работает как положено (монтажное И) без проблем отправлено Сергей Борщ 23 июля 2004 г. 13:03


EEpromID equ b'10100000'
TimerID equ b'11010000'
BQ2092ID equ b'00010110'
CBLOCK
TxBuffer,BitCounter,I2CTmp
EEADDR:2 ; 2-bytes
ENDC

I2CStart
;STACK LEVEL = 0
; BCF _SDAT ; prepare to make "0" bit *alredy done in init
; BCF _SCLK ; prepare to make "0" bit *alredy done in init
BSF _RP0 ; set data and clock lines for input => "1"
BSF _SDAT ; release data
BSF _SCLK ; release clock
BCF _RP0
I2CSTART_L1
btfss _SCLK ; wait until slave releases clock
goto I2CSTART_L1
goto $+1 ; about 4.7uS Bus Free Time
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
BSF _RP0
BCF _SDAT ; set data line for output => "0"
goto $+1 ; about 4.7uS Start Hold Time
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
bcf _SCLK ; set clock low
BCF _RP0 ; set clock line for output
return

I2CComplete
I2CStop
;STACK LEVEL=0
BSF _RP0
BCF _SDAT ; set data low
bsf _SCLK ; set clock high
BCF _RP0
I2CStop_L1
btfss _SCLK ; wait until slave releases clock
goto I2CStop_L1
goto $+1
goto $+1 ;Stop Setup Time
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
BSF _RP0
bsf _SDAT ; data goes high while clock high for stop bit
BCF _RP0
return

BitInOut
;STACK LEVEL=0
BSF _RP0
btfss _C ; check for state of data bit to xmit
BCF _SDAT ; set data line LOW
BTFSC _C ; check for state of data bit to xmit
BSF _SDAT ; set data line HIGH
nop ; data setup
bsf _SCLK ; release clock line
bcf _RP0
I2CBIO_L1
btfss _SCLK
goto I2CBIO_L1
goto $+1 ;clock high period
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
btfsc _SDAT ; read the data bit
bsf _C ; input bit was high, set _C
btfss _SDAT ; read the data bit
bcf _C ; input bit was low, clear _C
bcf _SCLK ; return clock line low
bsf _RP0
bcf _SCLK
goto $+1 ;clock low period
bsf _SDAT
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
bcf _RP0
return

I2CExchange ; 8 bits in W, ACK in _C
;STACK LEVEL=1
MOVWF TxBuffer
movlw .9
movwf BitCounter ; set the #bits to 9 ( 8 data+ack )
I2CELoop
rlf TxBuffer ; rotate txbuf left
call BitInOut ; send and receive bit
decfsz BitCounter ; 9 bits done?
goto I2CELoop ; no - go again
MOVFW TxBuffer
return ; with ack bit in _C

SetBQAddr ; for BQ20xx, address in W
movwf I2CTmp
movlw BQ2092ID
movwf SlaveAddr
goto SetI2CshortAddr
SetTimerAddr ; for M41Txx, address in W
movwf I2CTmp
movlw TimerID
movwf SlaveAddr
SetI2CshortAddr ; for 1-byte address
call I2CStart
bsf _C ; prepare to read ack
movfw SlaveAddr
call I2CExchange
btfsc _C
goto SetI2CshortAddr
movfw I2CTmp
bsf _C ; prepare to read ack
goto I2CExchange

SetEEAddr ; for 24x65
movlw EEpromID
movwf SlaveAddr
SetI2CAddr ; for 2-byte address
;STACK LEVEL=2
call I2CStart ; generate start bit
movfw SlaveAddr ; SET slave address
andlw 0xFE ; set write mode
bsf _C ; prepare to read ack
call I2CExchange ; and send it
btfsc _C ; device ACKed?
goto SetI2CAddr ; wait until write cycle stops
MOVFW EEADDR + 1 ; set HI word address
andlw 7fh ; to prevent accidental write protect write
bsf _C ; prepare to read ack
call I2CExchange ; and send it
movfW EEADDR ; set LO word address
bsf _C ; prepare to read ack
call I2CExchange ; and send it
return

ReadI2CFirst
;STACK LEVEL=2
call I2CStart ; generate start bit
movfw SlaveAddr ; SET slave address
iorlw 1 ; set read mode
bsf _C ; read ack
CALL I2CExchange ; and transmit it
btfsc _C ; repeat until ACK received
goto ReadI2CFirst
ReadI2CNext
iorlw 0xFF ; W=0xFF => read byte mode
bcf _C ; and send ACK
goto I2CExchange ; read 1 byte from device
ReadI2CLast
iorlw 0xFF ; W=0xFF => read byte mode
bsf _C ; and send NACK
call I2CExchange ; read 1 byte from device
goto I2CComplete

;/*****************************************************************/


LoadConfig
movlw LOW(EE_Config)
movwf EEADDR
movlw HIGH(EE_Config)
movwf EEADDR +1
call ReadI2CFirst
movwf Config
goto ReadI2CLast ; read fictive byte with NoAck & stop

SaveConfig
movlw LOW(EE_Config)
movwf EEADDR
movlw HIGH(EE_Config)
movwf EEADDR +1
call SetI2CAddr
movfw Config
call I2CExchange
goto I2CComplete



Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru