Форум РадиоКот https://radiokot.ru/forum/ |
|
ad9958 https://radiokot.ru/forum/viewtopic.php?f=59&t=145091 |
Страница 1 из 1 |
Автор: | baghear [ Чт май 11, 2017 18:13:00 ] |
Заголовок сообщения: | ad9958 |
Добрый день, хотелось бы запустить ad9958, используя stm32f103vet6, но пока ни как. Первое, что надо сделать - это понять, что ad9958 правильно принимает посылки. ДЛя этого надо включить её в 3 проводном режиме и прочитать како1-то регистр, за чтение отвечает sdio_2. Код: #include "stm32f10x.h" #define IO_UPDATE_HIGH GPIOA->BSRR = GPIO_BSRR_BS1;//rising edge #define IO_UPDATE_LOW GPIOA->BSRR = GPIO_BSRR_BR1; #define CS_HIGH GPIOA->BSRR = GPIO_BSRR_BS2; #define CS_LOW GPIOA->BSRR = GPIO_BSRR_BR2;//active #define MASTER_RESET_HIGH GPIOA->BSRR = GPIO_BSRR_BS3;//active #define MASTER_RESET_LOW GPIOA->BSRR = GPIO_BSRR_BR3; #define PWR_DWN_CTL_HIGH GPIOA->BSRR = GPIO_BSRR_BS4;//active #define PWR_DWN_CTL_LOW GPIOA->BSRR = GPIO_BSRR_BR4; #define DWT_CYCCNT *(volatile unsigned long *)0xE0001004 #define DWT_CONTROL *(volatile unsigned long *)0xE0001000 #define SCB_DEMCR *(volatile unsigned long *)0xE000EDFC void delay_us(uint16_t us) { int32_t u_count_tick = us * (SystemCoreClock/1000000); SCB_DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT_CYCCNT = 0; DWT_CONTROL|= DWT_CTRL_CYCCNTENA_Msk; while(DWT_CYCCNT < u_count_tick); DWT_CONTROL &= ~DWT_CTRL_CYCCNTENA_Msk; } ////////////////////////////// void delay_ms(uint16_t ms) { int32_t m_count_tick = ms * (SystemCoreClock/1000); SCB_DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT_CYCCNT = 0; DWT_CONTROL|= DWT_CTRL_CYCCNTENA_Msk; while(DWT_CYCCNT < m_count_tick); DWT_CONTROL &= ~DWT_CTRL_CYCCNTENA_Msk; } void SPI_Init(void) { //включаем тактирование порта A и альтернативных функций RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_AFIOEN; //PA1(IO_UPDATE)- выход push-pull //PA2(CS) - выход push-pull //PA3(MASTER_RESET) - выход push-pull //PA4(PWR_DWN_CTL) - выход push-pull //PA5(SCK) и PA7(MOSI) вывод - альтернативная функция push pull, GPIOA->CRL &= ~(GPIO_CRL_CNF1_0 | GPIO_CRL_CNF2_0 | GPIO_CRL_CNF3_0 | GPIO_CRL_CNF4_0 | GPIO_CRL_CNF5_0 | GPIO_CRL_CNF7_0); GPIOA->CRL |= GPIO_CRL_CNF5_1 | GPIO_CRL_CNF7_1; GPIOA->CRL |= GPIO_CRL_MODE1 | GPIO_CRL_MODE2 | GPIO_CRL_MODE3 | GPIO_CRL_MODE4 | GPIO_CRL_MODE5 | GPIO_CRL_MODE7; //включаем тактированиеSPI1 RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; SPI1->CR1 |= SPI_CR1_BR_2 ; //Baud rate SPI1->CR1 |= SPI_CR1_CPOL; //Polarity cls signal CPOL = 1; SPI1->CR1 |= SPI_CR1_CPHA; //Phase cls signal CPHA = 1; SPI1->CR1 &= ~SPI_CR1_DFF; //8 bit data SPI1->CR1 &= ~SPI_CR1_LSBFIRST; //MSB will be first SPI1->CR1 |= SPI_CR1_SSM | SPI_CR1_SSI; //Software slave management & Internal slave select SPI1->CR1 |= SPI_CR1_MSTR; //Mode Master SPI1->CR1 |= SPI_CR1_SPE; //EnableSPI1 } void DDS_Set(uint8_t data) { //ждём пока опустошится Tx буфер while(!(SPI1->SR & SPI_SR_TXE)); //отправляем данные SPI1->DR = data; delay_us(10); } /*данные передаются в регистр по возрастающему фронту*/ void IO_Update_Pulse(void) { delay_ms(100); IO_UPDATE_LOW delay_ms(100); IO_UPDATE_HIGH } int main(void) { SPI_Init(); PWR_DWN_CTL_LOW //CS и update в исходное состояние CS_HIGH IO_UPDATE_HIGH //сброс синтезатора MASTER_RESET_LOW delay_ms(100); MASTER_RESET_HIGH delay_ms(100); MASTER_RESET_LOW delay_ms(100); CS_LOW DDS_Set(0x00); // Адрес регистра DDS_Set(0xC2);//оба канала доступны, 3-проводной режим IO_Update_Pulse(); CS_HIGH while(1) { CS_LOW DDS_Set(0x80); //читаем нулевой регистр DDS_Set(0x00); IO_Update_Pulse(); CS_HIGH } А в ответ тишина, подскажите пожалуйста, что делаю не так. |
Автор: | AlanDrakes [ Чт май 11, 2017 18:37:47 ] |
Заголовок сообщения: | Re: ad9958 |
Вижу, что Вы инициализировали пины GPIOA 5 и 7. А остальные? По умолчанию, при старте процессора, пины включены на вход. В частности, /CS и, видимо, IO_Update. |
Автор: | baghear [ Чт май 11, 2017 18:43:57 ] |
Заголовок сообщения: | Re: ad9958 |
Будьте внимательны, все пины инициализированы. Посылки смотрел осцилом |
Автор: | AlanDrakes [ Пт май 12, 2017 14:10:25 ] |
Заголовок сообщения: | Re: ad9958 |
Извиняюсь. Перепутал с настройками L1 / F4 / F7, где значение 00 - это вход, а не выход. Перечитал код ещё раз. Перечитал снова. Почитал мануал к Вашему синтезатору и... по коду - всё верно. Попробуйте добавить слабую подтяжку на пин MISO контроллера. Других вариантом у меня пока что нет. Вот Здесь используют дополнительно пин SDIO_3, дёргая его почти совместно с /CS. Может, ещё так? А так же, есть Ответ, где так же рекомендуют подтягивать пин SDIO_3 и SYNC_I/O к питанию, т.к. активный уровень на них сбрасывает обмен SPI. Впрочем, Вы так же переводите последний к питанию, а вот про IO_3 - ничего не могу сказать. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |