Pat 0 21 сентября, 2005 Опубликовано 21 сентября, 2005 · Жалоба Суть проблеммы: не могу сгенерировать на выходе TF импульсный сигнал синхронизации, уже 3 дня мыкаюсь. Самое гланое что не работают только режимы 0x1 Negative Pulse Output 0x2 Positive Pulse Output которые устанавливаются в битовых полях FSOS: (Transmit Frame Sync Output Selection) регистра SSC_TFMR Остальные режимы работают без проблем 0x3 Driven Low during data transfer Output 0x4 Driven High during data transfer Output 0x5 Toggling at each start of data transfer Output Вот пример функции инициализации чего тут не так? Может кто подскажет //----------------------------------------------------------------------- // Настраиваем SSC //----------------------------------------------------------------------- void ssc_init(void) { // Подключаем мастер клок к SSC в блоке управления энергопотреблением // Бит 8 (AT91C_ID_SSC) регистра PMC_PCER включает SSC AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_SSC); // Выводы RD | RK | RF | TD | TK | TF подключены к переферийной шине А // Отключаем управление выходными портами МК от PIO AT91C_BASE_PIOA->PIO_PDR = (RD | RK | RF | TD | TK | TF); // Подключаем переферийную шину к выходным портам МК AT91C_BASE_PIOA->PIO_ASR = (RD | RK | RF | TD | TK | TF); // Включаем подтягивающие резисторы pa_pullup_set((RD | RK | RF | TK)); // Настраиваем SSC // Отключаем прерывания AT91C_BASE_SSC->SSC_IDR = (unsigned int) -1; // Сбрасываем SSC AT91C_BASE_SSC->SSC_CR = AT91C_SSC_SWRST | AT91C_SSC_RXDIS | AT91C_SSC_TXDIS ; // Отключаем внутренний генератор // Сбрасываем делитель частоты AT91C_BASE_SSC->SSC_CMR = 0; // Настраиваем приемник //.................... // регистр SSC_RCMR //.................... // Приемник получает тактовые импульсы от входа RK AT91C_BASE_SSC->SSC_RCMR = AT91C_SSC_CKS_RK; // по умолчанию SSC_RCMR:CKO = 0 используется только в мастер режиме // AT91C_BASE_SSC->SSC_RCMR |= AT91C_SSC_CKI; // по умолчанию SSC_RCMR:CKI = 0 принимает данные по заднему фронту SCLK // так как данные из Ad73360 передаются по переднему фронту SCLK // принимаем данные по заднему фронту SCLK (по умолчанию) // AT91C_BASE_SSC->SSC_RCMR |= AT91C_SSC_CKI; // Задний фронт на выводе RF служит условием старта для приема данных AT91C_BASE_SSC->SSC_RCMR |= AT91C_SSC_START_FALL_RF; // SSC_RCMR:STTDLY = 0 (по умолчанию) нет задержки для приема данных // после выполнения условия старт // SSC_RCMR:PERIOD = 0 (по умолчанию) нет задержки установки сигнала RF //.................... // регистр SSC_RFMR //.................... // Устанавливаем количество бит которые необходимо принять // Длина задается из условия DATALEN + 1 // Если DATALEN = от 1 до 7 то будет принят байт (8 бит) // Если DATALEN = от 8 до 15 то будет принято 2 байта (16 бит) // Если DATALEN = от 16 до 31 то будет принято 4 байта (32 бита) AT91C_BASE_SSC->SSC_RFMR = 15; // Режим эха отключен SSC_RFMR:LOOP = 0 // Прием данных осушествляем старшим битом вперед AT91C_BASE_SSC->SSC_RFMR |= AT91C_SSC_MSBF; // Длительность TF 1 период синхронизации AT91C_BASE_SSC->SSC_RFMR |= (1<<16); // Устанавливаем количество слов которые необходимо принять AT91C_BASE_SSC->SSC_RFMR |= (((1-1)<<8) & AT91C_SSC_DATNB); // Настраиваем передатчик //.................... // регистр SSC_TCMR //.................... // Передатчик получает тактовые импульсы от входа RK AT91C_BASE_SSC->SSC_TCMR = 0x01; // по умолчанию SSC_TCMR:CKO = 0 используется только в мастер режиме // SSC_ТCMR:CKI = 1 передаем данные по переднему фронту SCLK // так как Ad73360 принимает данные по заднему фронту SCLK то // прередаем данные по переднему фронту SCLK AT91C_BASE_SSC->SSC_TCMR |= AT91C_SSC_CKI; // Условием старта передатчика служит запись в SSC_THR регистр // по умолчанию SSC_TCMR:START = 0 AT91C_BASE_SSC->SSC_TCMR |= AT91C_SSC_START_TX;//AT91C_SSC_START_CONTINOUS;//AT91C_SSC_START_FALL_RF; // SSC_TCMR:STTDLY = 0 (по умолчанию) нет задержки для передачи данных // после выполнения условия старт // AT91C_BASE_SSC->SSC_TCMR |= ((1<<16) & AT91C_SSC_STTDLY); //.................... // регистр SSC_TFMR //.................... // Устанавливаем количество бит которые необходимо передать // Длина задается из условия DATALEN + 1 // Если DATALEN = от 1 до 7 то будет принят байт (8 бит) // Если DATALEN = от 8 до 15 то будет принято 2 байта (16 бит) // Если DATALEN = от 16 до 31 то будет принято 4 байта (32 бита) // DATALEN AT91C_BASE_SSC->SSC_TFMR = 15; // DATDEF Уровень на выходе TD во время ожидания AT91C_BASE_SSC->SSC_TFMR |= (0<<5); // MSBF Передаем данные старшим битом вперед AT91C_BASE_SSC->SSC_TFMR |= AT91C_SSC_MSBF; // DATNB Количество слов которые должны быть переданы после каждого условия START AT91C_BASE_SSC->SSC_TFMR |= (((1-1)<<8) & AT91C_SSC_DATNB); // FSLEN Длительность TF 1 период синхронизации AT91C_BASE_SSC->SSC_TFMR |= (0<<16); // FSOS Синхронизация передачи данных на выходе TF положительным импульсом AT91C_BASE_SSC->SSC_TFMR |= AT91C_SSC_FSOS_POSITIVE; // FSDEN Управление линией TD во время формирования сигнала TF AT91C_BASE_SSC->SSC_TFMR |= ((0<<23) & AT91C_SSC_FSDEN ); // FSEDGE Управление линией TD во время формирования сигнала TF AT91C_BASE_SSC->SSC_TFMR |= ((0<<23) & AT91C_SSC_FSDEN ); // Включаем приемник AT91C_BASE_SSC->SSC_CR = AT91C_SSC_RXEN; // Включаем передатчик AT91C_BASE_SSC->SSC_CR = AT91C_SSC_TXEN; // Данные из AD73360 передаются по переднему фронту SCLK, первый старший бит }//end ssc_init Это все необходимо для АЦП AD73360 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pat 0 24 сентября, 2005 Опубликовано 24 сентября, 2005 · Жалоба Сам разобрался не хватало установки AT91C_BASE_SSC->SSC_TCMR |= ((7<<24) & AT91C_SSC_PERIOD); Времени убил конечно немеряно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться