ну не верю я что ни кто ниработал с USI как I2c(+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено Balda 30 сентября 2005 г. 11:01

Вообщем кидаю исходника аппартной реализации I2C под TWI

может посмотрите свежим взглядом... где я обосрался?

правда код сырой - в основоном заточен под отладку...
но без аска работает кое как...
;-0-------------
1. вообщем инит...
разрешение прерывания старт кондишен
очистка флагов статуса
далее как тока старт учухал... идем на прерывание....

; Обработка старт пакета по I2c
;----------------------------------
прерывание по флагу старт кондишен....
PUSH TEMP
in temp,sreg
push temp
push temp2
;-----------------
ldi
temp,(1<|(0< out usicr,temp ; врубаем есче одно прерывание по переполнению счетчика уси
ну и разметка правильности клока
ldi temp,(1<;
out USISR,temp ; сброс флагов
;---
ldz bufer_lcd ; определяем буфер это лсд индикатор 16 символов
ldi temp,16
mov counter_twi,temp ; счетчик символов
;-----------------
pop temp2
pop temp
out sreg,temp
POP TEMP
reti ; сваливаем
----
Далее прерывание по переполнению счетчика типа приняли 8 бит (байт)
;-------------------------------
; Режимы работы I2C
.equ address_mode = 00
.equ slave_receive = 01
.equ slave_transmit = 02
;-------------------------------
USI_DATA:
PUSH TEMP
in temp,sreg
push temp
push temp2
;-----------------
lds temp,status_twi ; сначала находимся на проверки совпандения
адреса слейва
cpi temp,slave_receive
breq recv_mode
cpi temp,slave_transmit
breq trans_mode
;--- ADDRESS MODE ----
in temp,usidr
mov temp2,temp
andi temp,0b11111110
cpi temp,$24 ; типа если 24 то ок
brne init_start_condition ; здесь определяем че надо записать или
считать
ldi temp,slave_receive
sbrc temp2,7
ldi temp,slave_transmit
sts status_twi,temp
;---- send ASK
rcall send_ask ; все определили пердаем аск !!!!!!!!!!
rjmp check_mode
;********************************************
;-- RECEIVE MODE -----
recv_mode: ; сюда попадаем когда начнут валить данные
in temp,usidr
st z+,temp ;записываем в буфер
rcall send_ask ; передаем аск
; rjmp check_mode

;---
dec counter_twi ; смотрим на счетчик
brne check_mode
rjmp init_start_condition
sbis usisr,usipf !!!! НА САМОМ деле более грамотно
ослежиать по стопу
rjmp exit_int01 ; но он тоже чето не очень работает!!!!
rjmp init_start_condition
;-- TRANSMIT MODE ----
trans_mode: ; даже не до этого было ;-)

;---------------------
init_start_condition: ; тут типа если какой то глюк или конец передачи
инит уси
ldi
temp,(1<|(0< out usicr,temp
ldi temp,(1<;
out USISR,temp
ldz bufer_lcd
ldi temp,address_mode
sts status_twi,temp
exit_int01:
pop temp2
pop temp
out sreg,temp
POP TEMP
reti

;========================
check_mode: ; пока сдесь тоже ничего интересного
lds temp,status_twi ; номысля такая что смотерть за стопом...
cpi temp,slave_receive
breq sub_recv_mode

sub_recv_mode:
ldi temp,(1< out usisr,temp
;--
w03:
sbis pinb,5 ; wait sda =high
rjmp w03
;---
sbis usisr,usipf
rjmp exit_int01
rjmp init_start_condition
;========================
send_ask: !!!!!! ВОТ ТУТ САМОЕ ИНТЕРСНОЕ
;---
clr temp ; вообщем очищаем регистр данный чтоб аск был 0
out usidr,temp
set_twi:
; sbi ddrb,5 ; sda - out ; переводим направление на вывод - типа сда в
нуль
;---
ldi temp,(0< out usisr,temp ; очищаем флаг перполнения - только его и счетчик на
16-1=15 (1 бит всего пердать)
w01:
sbic usisr,usisif ; ждем пока передасться
rjmp w10
w02:
sbis usisr,usioif ; тоесть опка придет флаг преполнения или хотябы повт
старт вообщем одно из двух
rjmp w01 ; вообщем это уже агония пошла
w10:
cbi ddrb,5 ; sda - in ; все типа передалось - вернуть линию сда
;-----
ldi temp,(1< out usisr,temp ; заново сбросить все флаги кроме стопового
ret
;----
send_no_ask: ; нк тоже самое если не аск - это пока не рабоатет
ldi temp,$80
out usidr,temp
rjmp set_twi
;========================


; Вот вообщем идея такая....
но что то не ладится


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

Ответы



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

E-mail: info@telesys.ru