#include "includes.h"
/*******************************************************************************
* Function Name : SPI1_Config
* Description : Configures SPI
* Input : None.
* Return : None.
*******************************************************************************/
void SPI1_Config(void)
{
SPI_InitTypeDef SPI_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
#ifndef DACSPI_IOSim
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;//Pin5-SCK,Pin6-SIMO,Pin7-MOSI
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
SPI_I2S_DeInit(SPI1);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;//设置SPI工作模式:设置为主SPI
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;//设置SPI的数据大小:SPI发送接收8位帧结构
SPI_InitStruct.SPI_CPOL=SPI_CPOL_Low;;//选择了串行时钟的稳态:时钟悬空低
SPI_InitStruct.SPI_CPHA=SPI_CPHA_1Edge;//数据捕获于第一个时钟沿
SPI_InitStruct.SPI_NSS=SPI_NSS_Soft;//SPI_NSS_Soft;//NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
SPI_InitStruct.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_16; //定义波特率预分频的值:波特率预分频值为16
SPI_InitStruct.SPI_FirstBit=SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI_Init(SPI1,&SPI_InitStruct);//根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
SPI_Cmd(SPI1,ENABLE);//使能SPI外设
SPI_I2S_ClearITPendingBit(SPI1, SPI_I2S_IT_RXNE);
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, DISABLE);
#else
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
SCLK = 0;
MOSI = 1;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStruct);
#endif
}
/*******************************************************************************
* Function Name : SPI1_TransferBlock
* Description : SPI1 Transfer
* Input : *TXData Send buf
: *RXData Receive buf
: num Transfer num
* Return : None.
*******************************************************************************/
void SPI1_TransferBlock(unsigned char *TXData, unsigned char *RXData, unsigned int num)
{
unsigned int i;
for(i = 0; i < num; i++)
{
if(TXData != NULL)
{
SPI_I2S_SendData(SPI1,*TXData);
TXData++;
}
else
{
SPI_I2S_SendData(SPI1,0);
}
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY)); //等待SPI发送完成
if(RXData != NULL)
{
*RXData = SPI_I2S_ReceiveData(SPI1);
RXData++;
}
}
}
/*******************************************************************************
* Function Name : SPI1_OutThreeData
* Description : send three data to spi
* Input : None.
* Return : None.
*******************************************************************************/
void SPI1_OutThreeData(u32 data)
{
#ifndef DACSPI_IOSim
u8 tmp;
SPI_I2S_SendData(SPI1,(data >> 16) & 0xff);
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY)); //等待SPI发送完成
tmp = SPI_I2S_ReceiveData(SPI1);
SPI_I2S_SendData(SPI1,(data >> 8) & 0xff);
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY));
tmp = SPI_I2S_ReceiveData(SPI1);
SPI_I2S_SendData(SPI1,data & 0xff);
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY));
tmp = SPI_I2S_ReceiveData(SPI1);
#else
u8 i;
for(i = 0; i < 24; i++)
{
SCLK = 1;
MOSI = (data & 0x800000) ? 1 : 0;
SCLK = 0;
data <<= 1;
}
#endif
}
/*******************************************************************************
* Function Name : SPI1_OutFourData
* Description : send four data to spi
* Input : None.
* Return : None.
*******************************************************************************/
void SPI1_OutFourData(u32 data)
{
#ifndef DACSPI_IOSim
u8 tmp;
SPI_I2S_SendData(SPI1,(data >> 24) & 0xff);
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY)); //等待SPI发送完成
SPI_I2S_SendData(SPI1,(data >> 16) & 0xff);
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY)); //等待SPI发送完成
tmp = SPI_I2S_ReceiveData(SPI1);
SPI_I2S_SendData(SPI1,(data >> 8) & 0xff);
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY));
tmp = SPI_I2S_ReceiveData(SPI1);
SPI_I2S_SendData(SPI1,data & 0xff);
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY));
tmp = SPI_I2S_ReceiveData(SPI1);
#else
u8 i;
for(i = 0; i < 32; i++) {
SCLK = 1;
MOSI = (data & 0x80000000) ? 1 : 0;
SCLK = 0;
data <<= 1;
}
#endif
}
/*******************************************************************************
* Function Name : DAC_IO_Init
* Description : DAC_IO_Init
* Input : None.
* Return : None.
*******************************************************************************/
void DAC8565_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
LDAC8565 = 0;
ENA8565 = 0;
Sync8565 = 1;
Rest8565Enable;
GPIO_Init(GPIOA,&GPIO_InitStruct);
}
/*******************************************************************************
* Function Name : DAC8565_Init
* Description : DAC8565_Init
* Input : None.
* Return : None.
*******************************************************************************/
//int dac_value1[4]={39212,26225,45875,19661};//500,-500,1000,-1000
void DAC8565_Init(void)
{
ENA8565 = 0;//低,优先连接SPI到串行端口
LDAC8565 = 0;
Rest8565Enable;//复位
OSTimeDly (1);
Rest8565Disable;
SPI1->CR1 &= ~0x0040; //禁止SPI
SPI1->CR1 |= 0x0001; //DAC需要第二个时钟沿采集数据
SPI1->CR1 |= 0x0040; //使能SPI
Sync8565 = 0;
SPI1_OutThreeData(DAC8565_REFON);//内部参考Vref上的电压2.5V
Sync8565 = 1;
SPI1->CR1 &= ~0x0040;
SPI1->CR1 &= 0xFFFE; //ADC需要第一个时钟沿采集数据
SPI1->CR1 |= 0x0040;
//load_bias_dacs(dac_value1) ;
}
/*******************************************************************************
* Function Name : load_bias_dacs
* Description : 根据参数设置DAC电压值,Vo=5*D/65536-2.5
* Input : None.
* Return : None.
*******************************************************************************/
void load_bias_dacs(int *p)
{
int i;
u32 tmpdata;
SPI1->CR1 &= ~0x0040; //spi通信的设置????
SPI1->CR1 |= 0x0001;
SPI1->CR1 |= 0x0040;
for(i = 0; i < 4; i++)
{
// if(setup[i].group_status == GROUP_DRIVE_A) {
// tmpdata = (i << 17) | (setup[i].driveA_voltage & 0xffff);
// } else if(setup[i].group_status == GROUP_DRIVE_B) {
// tmpdata = (i << 17)
评论4