Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

ad9958

Чт май 11, 2017 18:13:00

Добрый день, хотелось бы запустить 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

}   


А в ответ тишина, подскажите пожалуйста, что делаю не так.

Re: ad9958

Чт май 11, 2017 18:37:47

Вижу, что Вы инициализировали пины GPIOA 5 и 7. А остальные?
По умолчанию, при старте процессора, пины включены на вход.
В частности, /CS и, видимо, IO_Update.

Re: ad9958

Чт май 11, 2017 18:43:57

Будьте внимательны, все пины инициализированы.
Посылки смотрел осцилом

Re: ad9958

Пт май 12, 2017 14:10:25

Извиняюсь. Перепутал с настройками L1 / F4 / F7, где значение 00 - это вход, а не выход.
Перечитал код ещё раз. Перечитал снова. Почитал мануал к Вашему синтезатору и... по коду - всё верно.
Попробуйте добавить слабую подтяжку на пин MISO контроллера.
Других вариантом у меня пока что нет.

Вот Здесь используют дополнительно пин SDIO_3, дёргая его почти совместно с /CS. Может, ещё так?
А так же, есть Ответ, где так же рекомендуют подтягивать пин SDIO_3 и SYNC_I/O к питанию, т.к. активный уровень на них сбрасывает обмен SPI.
Впрочем, Вы так же переводите последний к питанию, а вот про IO_3 - ничего не могу сказать.
Ответить