Чт май 11, 2017 18:13:00
#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
}
Чт май 11, 2017 18:37:47
Чт май 11, 2017 18:43:57
Пт май 12, 2017 14:10:25