|
Кто нибудь писал имплементацию twi/i2c на usi для слейва? |
|
|
|
Jan 31 2011, 08:50
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(AlexTech @ Jan 31 2011, 11:29)  Поделитесь опытом плиз, слейв упорно ack отсылать не хочет :/ Браво, это же надо же какое слово ИМПЛЕМЕНТАЦИЯ ИМПЛЕМЕНТАЦИЯ (от лат. impleo - наполняю, исполняю), осуществление, исполнение ГОСУДАРСТВОМ международных правовых норм. Каждое государство само определяет методы и средства имплементации. В международном договоре также может быть предусмотрена необходимость издания закона или иного акта для его осуществления К чему это слово Вы употребили? Как не однократно писалось на форуме , к огромному сожалению телепатов здесь нет- схему , код
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Jan 31 2011, 09:07
|
Местный
  
Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940

|
Application note AVR312 Using USI as I2C Slave Application note AVR310 Using USI as TWI Application note AVR319 Using USI as SPI to ILYAUL Из англо-русского словаря: Цитата implementation - выполнение, исполнение, осуществление, РЕАЛИЗАЦИЯ Synonym: realization , accomplishment Вы где находитесь, на форуме юристов или на форуме програмистов ?!?!
|
|
|
|
|
Jan 31 2011, 09:17
|
Местный
  
Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940

|
Цитата Всё верно , только это слово применяется в юридических документах. ДА НУ !!!!!!! Откройте например правила оформления модуля в Object Pascal : Код unit NAME; interface ....... implementation // !!!!!!!!!!!!!!!!!!!!! ...... end. Не говоря уж о хардварных языках, например, VHDL. Да и сам Atmel выдает: AVR302: Software I2C™ Slave Implementation
Сообщение отредактировал alexeyv - Jan 31 2011, 09:27
|
|
|
|
|
Jan 31 2011, 09:25
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(alexeyv @ Jan 31 2011, 12:17)  ДА НУ !!!!!!! Откройте например правила оформления модуля в Object Pascal : Код unit NAME; interface ....... implementation // !!!!!!!!!!!!!!!!!!!!! ...... end. Не говоря уж о хардварных языках, например, VHDL. Убедили , не знал . Хотя наши юристы , его применяют исключительно , в гос. документах
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Jan 31 2011, 09:27
|
Частый гость
 
Группа: Участник
Сообщений: 83
Регистрация: 2-12-05
Пользователь №: 11 688

|
Простите, русский с английским в голове перемешиваются ))) Собственно вот отсюда взято - "AVR310:..... This application note describes a TWI master implementation" С английского implementation — «осуществление», «выполнение» и только по русски это имеет отношение именно к международному праву )))) Схема... ну какая схема, два провода между мастером на меге128 и слейвом на тинке26 плюс часики ds1307. Работает что нибудь одно, или читаю часики или пишу в слейв. сначала протеус говорил что поддельные данные на линии SCL, код инициализации слейва был такой: CODE // прям в этой строчке протеус ругался и останавливал обмен, в железе же слейв был доступен, часики нет DDR_USI |= ( 1 << PORT_USI_SCL ) | ( 1 << PORT_USI_SDA );
PORT_USI |= ( 1 << PORT_USI_SCL ); PORT_USI |= ( 1 << PORT_USI_SDA ); DDR_USI &= ~( 1 << PORT_USI_SDA ); USICR = ( 1 << USISIE ) | ( 0 << USIOIE ) | ( 1 << USIWM1 ) | ( 0 << USIWM0 ) | ( 1 << USICS1 ) | ( 0 << USICS0 ) | ( 0 << USICLK ) | ( 0 << USITC ); USISR = ( 1 << USI_START_COND_INT ) | ( 1 << USIOIF ) | ( 1 << USIPF ) | ( 1 << USIDC );
поменял немного, стало так: PORT_USI |= (1<<PORT_USI_SCL); PORT_USI |= (1<<PORT_USI_SDA); DDR_USI |= (1<<PORT_USI_SCL); DDR_USI &= ~(1<<PORT_USI_SDA); USICR = (1<<USISIE)|(0<<USIOIE)|(1<<USIWM1)|(0<<USIWM0)|(1<<USICS1)|(0<<USICS0)|(0<<USICLK)|(0<<USITC); USISR = 0xF0;
протеус ругаться вроде перестал, часики читаются, но слейв теперь не отдает ack(ну я так думаю) ISR( USI_OVERFLOW_VECTOR ) { switch ( overflowState ) { case USI_SLAVE_CHECK_ADDRESS: if ( ( USIDR == 0 ) || ( ( USIDR >> 1 ) == slaveAddress) ) // проверяем адрес { if ( USIDR & 0x01 )// read/write { overflowState = USI_SLAVE_SEND_DATA; }else{ overflowState = USI_SLAVE_REQUEST_DATA; // ставим флаг получить данные, сюда попадаем } SET_USI_TO_SEND_ACK( ); //шлем ack // сюда попадаем }else{ SET_USI_TO_TWI_START_CONDITION_MODE( ); } break; case USI_SLAVE_REQUEST_DATA: // а блин вот сюда никогда больше не попадаем overflowState = USI_SLAVE_GET_DATA_AND_SEND_ACK; SET_USI_TO_READ_DATA( ); break; } }
SET_USI_TO_SEND_ACK( ) { USIDR = 0; DDR_USI |= ( 1 << PORT_USI_SDA ); USISR = ( 0 << USI_START_COND_INT ) | ( 1 << USIOIF ) | ( 1 << USIPF ) | ( 1 << USIDC )| ( 0x0E << USICNT0 ); }
Ух, как то так ))
Сообщение отредактировал IgorKossak - Jan 31 2011, 10:22
Причина редактирования: Оформление кода в [codebox]
|
|
|
|
|
Jan 31 2011, 10:11
|
Частый гость
 
Группа: Участник
Сообщений: 83
Регистрация: 2-12-05
Пользователь №: 11 688

|
по 312 и сделано, и мной, и несколько чужих исходников пробовал, поведение одинаковое протеус не ест вообще то, что по 312 сделано, ну да бог с ним, в железе кое как работает
в первом варианте при отсоединении часов ничего не меняется, меняется именно при отсоединении тинки, часы читаться сразу нормально начинают а во втором варианте, как я написал, тинка не мешает часам, но не попадает собственно в процедуру приема
Сообщение отредактировал AlexTech - Jan 31 2011, 10:13
|
|
|
|
|
Jan 31 2011, 10:34
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(AlexTech @ Jan 31 2011, 13:30)  Нет ))) я так понимаю что тинка гадит на scl и мешает часам, а если это гаженье убрать (вот тут мне не отловить косяк) то ли мастер не понимает ack который тинка шлет после проверки адреса и соответственно не передает данные, то ли тинка его реально не отправлят Отсоедините часы , зациклите START и Адрес , посмотрите , что на шине, как я понял в железе есть.
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Jan 31 2011, 11:11
|
Частый гость
 
Группа: Участник
Сообщений: 83
Регистрация: 2-12-05
Пользователь №: 11 688

|
В железе есть, да, а чем смотреть то? осциллографа нет, поэтому в протеусе и тестил, а он оказывается таких извратов не понимает )) разве что леды на шину воткнуть :/ Вот старт: Код ISR( USI_START_VECTOR ) {
overflowState = USI_SLAVE_CHECK_ADDRESS;
DDR_USI &= ~( 1 << PORT_USI_SDA );
while ( // SCL his high ( PIN_USI & ( 1 << PIN_USI_SCL ) ) && // and SDA is low !( ( PIN_USI & ( 1 << PIN_USI_SDA ) ) ) );
if ( !( PIN_USI & ( 1 << PIN_USI_SDA ) ) ) { // not stop USICR = ( 1 << USISIE ) | ( 1 << USIOIE ) | ( 1 << USIWM1 ) | ( 1 << USIWM0 ) | ( 1 << USICS1 ) | ( 0 << USICS0 ) | ( 0 << USICLK ) | ( 0 << USITC ); }else{ // stop USICR = ( 1 << USISIE ) | ( 0 << USIOIE ) | ( 1 << USIWM1 ) | ( 0 << USIWM0 ) | ( 1 << USICS1 ) | ( 0 << USICS0 ) | ( 0 << USICLK ) | ( 0 << USITC ); }
USISR = // clear interrupt flags and release SCL ( 1 << USI_START_COND_INT ) | ( 1 << USIOIF ) | ( 1 << USIPF ) |( 1 << USIDC ) | ( 0x0 << USICNT0); }
Сообщение отредактировал AlexTech - Jan 31 2011, 11:22
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|