Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: TWI + 24CXX
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
pavel-pervomaysk
Всем привет ! Вопрос в названии темы , запись происходит нормально
ниже код , а вот в послежовательности чтения вкурить не могу 01.gif , пробовал подавать старт / адрес чипа / адрес ячейки / а вот в TWDR нужного значения после чтения получить не смог , пните в путь истенный , буду рад .

WRITE_EE: // REC_BYTEI2C
ldi tmp, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
out TWCR,tmp // start
wait_st: // Ожидание старта
in tmp,TWCR //
sbrs tmp,TWINT //
jmp wait_st //

ldi tmp,0xAE // ADRESS CHIP
out TWDR,tmp //
ldi tmp, (1<<TWINT)|(1<<TWEN)
out TWCR,tmp //
wait_chip: //
in tmp,TWCR //
sbrs tmp,TWINT //
jmp wait_chip //

mov tmp,tmp1 // Скопировать данные адреса из tmp1
out TWDR,tmp // DATA ADRESS BYTE
ldi tmp, (1<<TWINT)|(1<<TWEN)
out TWCR,tmp //
wait_ad: //
in tmp,TWCR //
sbrs tmp,TWINT //
jmp wait_ad //

mov tmp,tmp2 // Скопировать данные из регистра tmp2
out TWDR,tmp // DATA BYTE
ldi tmp, (1<<TWINT)|(1<<TWEN)
out TWCR,tmp //
wait_data: //
in tmp,TWCR //
sbrs tmp,TWINT //
jmp wait_data //
ldi r16, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
out TWCR,tmp // STOP I2C
ret //
IgorKossak
Нужна следующая последовательность:
старт\адрес чипа + W\адрес ячейки\старт\адрес чипа + R\читаем байты...\стоп.
В документации читайте внимательно.

И пользуйтесь форматированием при вставке текста программы, читать не очень то приятно.
pavel-pervomaysk
Цитата(IgorKossak @ Nov 26 2008, 15:42) *
Нужна следующая последовательность:
старт\адрес чипа + W\адрес ячейки\старт\адрес чипа + R\читаем байты...\стоп.
В документации читайте внимательно.

И пользуйтесь форматированием при вставке текста программы, читать не очень то приятно.


Спасибо , все получилось , конечно не без сторонней помощи .

CODE

long_code_here = ';

READ_EE: // READ_BYTEI2C
clr tmp // tmp -> 0
ldi tmp, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
out TWCR,tmp // start
wait_rst: // WAIT READ START TWI
in tmp,TWCR //
sbrs tmp,TWINT //
jmp wait_rst // ожидание сброса TWINT
in tmp,TWSR // читаем статус регистр
andi tmp,0xf8 // убираем лишнее
cpi tmp,0x08 // если старт прошел успешно , если нет то стоп
breq adr_chip // идем дальше
jmp stop_i2c // идем на стоп

adr_chip: // SEND ADRESS CHIP 0xAE
ldi tmp,0xAE //
out TWDR,tmp //
ldi tmp, (1<<TWINT)|(1<<TWEN)
out TWCR,tmp //
wait_ad1: // WAIT SEND ADRESS CHIP
in tmp,TWCR //
sbrs tmp,TWINT // ожидание сброса TWINT
jmp wait_ad1 // ожидание сброса TWINT
in tmp,TWSR // читаем статус регистр
andi tmp,0xf8 // убираем лишнее
cpi tmp,0x18 // если SLA+W прошло успешно , если нет то стоп
breq ad_read // идем дальше
jmp stop_i2c // идем на стоп

ad_read: // Адрес ячейки которую нужно считать из памяти
ldi tmp,0x00 // передаем адрес ячейки которую нужно считать из памяти
out TWDR,tmp //
ldi tmp, (1<<TWINT)|(1<<TWEN)
out TWCR,tmp //
wait_ad_read: //
in tmp,TWCR //
sbrs tmp,TWINT //
jmp wait_ad_read //
in tmp,TWSR // читаем статус регистр
andi tmp,0xf8 // убираем лишнее
cpi tmp,0x28 // если SLA+W прошло успешно , если нет то стоп
breq restart // идем дальше
jmp stop_i2c // идем на стоп


restart: // повстарт
ldi tmp, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
out TWCR,tmp // start
wait_restart: //
in tmp,TWCR //
sbrs tmp,TWINT //
jmp wait_restart //
in tmp,TWSR // читаем статус регистр
andi tmp,0xf8 // убираем лишнее
cpi tmp,0x10 // если повстарт прошел успешно , если нет то стоп
breq ad_read2 // идем дальше
jmp stop_i2c // идем на стоп


ad_read2: //
ldi tmp,0xAF //
out TWDR,tmp // Посылаем посылку SLA+R
ldi tmp, (1<<TWINT)|(1<<TWEN)
out TWCR,tmp //

wait_ad_read2:
in tmp,TWCR //
sbrs tmp,TWINT //
jmp wait_ad_read2 //
in tmp,TWSR // читаем статус регистр
andi tmp,0xf8 // убираем лишнее
cpi tmp,0x40 // если SLA+R прошло успешно , если нет то стоп
breq read_b // идем дальше
jmp stop_i2c // идем на стоп

read_b: //
ldi tmp, (1<<TWINT)|(1<<TWEN)
out TWCR,tmp //
wait_readb:
in tmp,TWCR //
sbrs tmp,TWINT //
jmp wait_readb //
in tmp,TWSR // читаем статус регистр
andi tmp,0xf8 // убираем лишнее
cpi tmp,0x58 // если старт прошел успешно , если нет то стоп
breq read_byte // идем дальше
jmp stop_i2c // идем на стоп

read_byte: //
in ZL,TWDR //
stop_i2c: // STOP I2C
ldi r16, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
out TWCR,tmp //
ret //


Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.