|
楼主 |
发表于 2012-12-22 15:39:08
|
显示全部楼层
源代码如下 /* Includes ------------------------------------------------------------------*/
#include "main.h"
void Delay_W5100(unsigned int x)
{
unsigned int i;
for(i=0;i<x;i++)
;
}
void AD5724_Init(void)
{
SPI2_Init();
AD5724_nLDAC_Init();
AD5724_nCLR_Init();
AD5724_nCLR_On();
AD5724_nLDAC_Off();
SPI2_SCK_Off();
SPI2_NSS_On();
}
void SPI2_Init(void)
{
SPI2_NSS_Init();
SPI2_SCK_Init();
SPI2_MOSI_Init();
SPI2_MISO_Init();
}
void SPI2_MISO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// Enable the W5100_INT Clock
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
// Configure W5100_INT pin as input
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void SPI2_MOSI_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable the GPIO_LED Clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
/* Configure the GPIO_LED pin */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_15);
}
void SPI2_SCK_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable the GPIO_LED Clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
/* Configure the GPIO_LED pin */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_13);
}
void SPI2_NSS_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable the GPIO_LED Clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
/* Configure the GPIO_LED pin */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_SetBits(GPIOG,GPIO_Pin_7);
}
void AD5724_nLDAC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable the GPIO_LED Clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
/* Configure the GPIO_LED pin */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_8);
}
void AD5724_nCLR_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable the GPIO_LED Clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
/* Configure the GPIO_LED pin */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_7);
}
void SPI2_MOSI_On(void)
{
GPIOB->BSRRL = GPIO_Pin_15;
}
void SPI2_MOSI_Off(void)
{
GPIOB->BSRRH = GPIO_Pin_15;
}
void SPI2_SCK_On(void)
{
GPIOB->BSRRL = GPIO_Pin_13;
}
void SPI2_SCK_Off(void)
{
GPIOB->BSRRH = GPIO_Pin_13;
}
void SPI2_NSS_On(void)
{
GPIOG->BSRRL = GPIO_Pin_7;
}
void SPI2_NSS_Off(void)
{
GPIOG->BSRRH = GPIO_Pin_7;
}
void AD5724_nLDAC_On(void)
{
GPIOA->BSRRL = GPIO_Pin_8;
}
void AD5724_nLDAC_Off(void)
{
GPIOA->BSRRH = GPIO_Pin_8;
}
void AD5724_nCLR_On(void)
{
GPIOC->BSRRL = GPIO_Pin_7;
}
void AD5724_nCLR_Off(void)
{
GPIOC->BSRRH = GPIO_Pin_7;
}
void WriteToAD5724RViaSpi(uint32_t Data)
{
uint8_t i;
// SPI start
SPI2_NSS_On();
Delay_W5100(40);
SPI2_NSS_Off(); //bring CS low
Delay_W5100(20);
for(i=0; i<24; i++)
{
SPI2_SCK_On();
Delay_W5100(20);
if(0x800000 == (Data & 0x800000))
{
SPI2_MOSI_On();
}
else
{
SPI2_MOSI_Off();
}
Delay_W5100(20);
SPI2_SCK_Off();
Delay_W5100(20);
Data = Data << 1;
Delay_W5100(20);
}
Delay_W5100(40);
SPI2_NSS_On();
Delay_W5100(40);
}
void ConfigAD5724R(void)
{
uint8_t i;
uint32_t ins[3];
ins[1] = Power_Control_Register | PowerUp_ALL ;
ins[0] = Output_Range_Select_Register | Range5_Select | DAC_Channel_ALL ;
for(i=0; i<2; i++)
{
WriteToAD5724RViaSpi(ins[i]);
Delay_W5100(2000);
Delay_W5100(2000);
}
}
uint32_t ReadFromAD5724RViaSpi(uint32_t Data)
{
uint8_t i;
uint32_t R_Data = 0;
uint32_t Noop = Nop;
WriteToAD5724RViaSpi(Data);
SPI2_NSS_On();
Delay_W5100(100);
SPI2_NSS_Off();
Delay_W5100(20);
for(i=0; i<24; i++)
{
SPI2_SCK_On();
Delay_W5100(20);
//////////////////////////////////////////////////
if(0x800000 == (Noop & 0x800000))
{
SPI2_MOSI_On();; //Send one to SDI pin
}
else
{
SPI2_MOSI_Off();; //Send zero to SDI pin
}
Noop = Noop << 1;
R_Data = R_Data << 1;
Delay_W5100(20);
//////////////////////////////////////////////////
SPI2_SCK_Off();
Delay_W5100(20);
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6) == 0x01)
{
R_Data = R_Data | 0x01;
}
Delay_W5100(30);
}
Delay_W5100(40);
SPI2_NSS_On();
Delay_W5100(20);
return R_Data;
}
|
|