ad9958

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

ad9958

Сообщение baghear »

Добрый день, хотелось бы запустить 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
Прорезались зубы
Сообщения: 236
Зарегистрирован: Пн июл 04, 2016 16:51:22
Откуда: Россия, Омск

Re: ad9958

Сообщение AlanDrakes »

Вижу, что Вы инициализировали пины GPIOA 5 и 7. А остальные?
По умолчанию, при старте процессора, пины включены на вход.
В частности, /CS и, видимо, IO_Update.
Реклама
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: ad9958

Сообщение baghear »

Будьте внимательны, все пины инициализированы.
Посылки смотрел осцилом
Аватара пользователя
AlanDrakes
Прорезались зубы
Сообщения: 236
Зарегистрирован: Пн июл 04, 2016 16:51:22
Откуда: Россия, Омск

Re: ad9958

Сообщение AlanDrakes »

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

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

Вернуться в «ARM»