GD32F303硬件SPI0控制DAC_SGM5349A芯片
GD32F303——SPI0配置
GD32F303软件配置
/*-SPI.c文件-*/
#include "gd32f30x.h"
#include "basedata.h"
#include "dac_sgm5349a.h"
#include "spi.h"
/**********************************************/
* @brief:SPI0初始化(GD32F303CCT6)
* @param:null
* @return:null
* @explain:SPI0初始化,没有中断和DMA
***********************************************/
void SPI0_Init(void)
{
spi_parameter_struct spi_init_struct; /*-SPI结构-*/
/*----------------GPIO相关初始化----------------*/
rcu_periph_clock_enable(RCU_AF); /*-AF时钟使能-*/
rcu_periph_clock_enable(RCU_GPIOA); /*-GPIOA时钟使能-*/
rcu_periph_clock_enable(RCU_SPI0); /*-使能SPI0时钟-*/
/*-SPI0 GPIO config: NSS/PA4,SCK/PA5, MISO/PA6, MOSI/PA7-*/
/*-DAC GPIO config: LDAC/PA3, SYNC/PA4, SCLK/PA5, DIN/PA6, CLR/PA7-*/
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7); /*-SCK,MOSI-*/
/*-todo 可以配置为输出引脚-*/
/*-GPIOA_6设置为输出引脚 TODO-*/
//gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6); /*-MISO-*/
gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3 | GPIO_PIN_4); /*-NSS-*/
/*----------------SPI相关初始化----------------*/
spi_i2s_deinit(SPI0);
spi_struct_para_init(&spi_init_struct);
spi_init_struct.device_mode = SPI_MASTER; /*-主机模式-*/
spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; /*-全双工-*/
spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT; /*-帧数据位8-*/
spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE; /*-工作模式0-*/
spi_init_struct.nss = SPI_NSS_SOFT; /*-软件控制NSS位-*/
spi_init_struct.prescale = SPI_PSC_256; /*-分频256-*/
spi_init_struct.endian = SPI_ENDIAN_MSB; /*-大端模式-*/
spi_init(SPI0, &spi_init_struct);
spi_enable(SPI0);/*-使能SPI0-*/
DAC_CLR(1); /*-控制芯片引脚CLR置高-*/
}
/**********************************************
* @brief:SPI发送单字节数据(SPI0)
* @param:
* @return:null
* @explain:SPI0初始化,没有中断和DMA
***********************************************/
BYTE spi_master_send_recv_byte(BYTE Data)
{
BYTE ByteSend,ByteRecv;
ByteSend = Data;
while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_TBE));
spi_i2s_data_transmit(SPI0,ByteSend);
while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE));
ByteRecv=spi_i2s_data_receive(SPI0);
return ByteRecv;
}
/*-SPI.h文件-*/
#ifndef __SPI_H
#define __SPI_H
#include "basedata.h" /*-基本数据-*/
/*-函数声明-*/
void SPI0_Init(void);
BYTE spi_master_send_recv_byte(BYTE Data);
#endif
DAC芯片程序文件
/*-DAC_SGM5349A.c文件-*/
#include "gd32f30x.h"
#include "basedata.h"
#include "dac_sgm5349a.h"
#include "systick.h"
#include "spi.h"
/**********************************************
* @brief:设置DAC通道数据
* @param:Channel DAC通道
* @param:Data DAC输出值
* @return:null
* @explain:设置DAC各个通道的数据
***********************************************/
void Set_DACOutPut(BYTE Address, WORD Data)
{/******************设置命令数据格式***********************
* 【31:28】 【27:24】 【23:20】 【19:4】 【3:0】 *
*don't care Command Address Data bits don't care*
********************************************************/
BYTE SetData[3];
DAC_LDAC(0); /*-允许数据更新-*/
DAC_SYNC(0); /*-片选信号-*/
delay_1ms(1);
SetData[0] = Address | (BYTE)(Data>>12);
SetData[1] = (BYTE)(Data>>4) | 0x00;
SetData[2] = (BYTE)(Data<<4) | 0x00;
/*-设置寄存器地址-*/
spi_master_send_recv_byte(WriteUpdate_Reg); /*-写入寄存器-*/
spi_master_send_recv_byte(SetData[0]); /*-写入地址和数据-*/
spi_master_send_recv_byte(SetData[1]); /*-写入数据-*/
spi_master_send_recv_byte(SetData[2]); /*-写入数据-*/
delay_1ms(1);
DAC_LDAC(1); /*-允许数据更新-*/
DAC_SYNC(1); /*-片选信号-*/
}
/*-DAC_SGM5349A.h文件-*/
#ifndef __DAC_SGM5349A_H
#define __DAC_SGM5349A_H
#include "basedata.h"
/*-引脚配置宏定义-*/
#define DAC_LDAC(x) gpio_bit_write(GPIOA,GPIO_PIN_3,x)
#define DAC_SYNC(x) gpio_bit_write(GPIOA,GPIO_PIN_4,x)
#define DAC_CLR(x) gpio_bit_write(GPIOA,GPIO_PIN_7,x)
/*-Commmand Definitions-*/
#define WriteInput_Reg 0x00
#define UpdateDAC_Reg 0x01
#define WriteUpdate_Reg 0x02
#define WU_DACChannel_Reg 0x03
#define PowerControl_Reg 0x04
#define ClearCode_Reg 0x05
#define LoadLDAC_Reg 0x06
#define Reset_Reg 0x07 /*-复位寄存器-*/
/*-Address Commands(发送数据时地址在前4个Bits)-*/
#define DAC_A 0x00 /*-通道1-*/
#define DAC_B 0x10 /*-通道2-*/
#define DAC_C 0x20 /*-通道3-*/
#define DAC_D 0x30 /*-通道4-*/
#define DAC_E 0x40 /*-通道5-*/
#define DAC_F 0x59 /*-通道6-*/
#define DAC_G 0x60 /*-通道7-*/
#define DAC_H 0x70 /*-通道8-*/
#define DAC_ALL 0xF0 /*-通道all-*/
/*-函数声明-*/
void Set_DACOutPut(BYTE Address, WORD Data);
#endif
/*-Task.c文件(这里是对函数的引用)-*/
/*-设置通道1输出10-*/
DeviceData.DAC_Data.Channel_1 = 10;
Set_DACOutPut(DAC_A, DeviceData.DAC_Data.Channel_1);
/*-设置通道1输出30-*/
DeviceData.DAC_Data.Channel_1 = 30;
Set_DACOutPut(DAC_A, DeviceData.DAC_Data.Channel_1);
/*-设置通道1输出50-*/
DeviceData.DAC_Data.Channel_1 = 60;
Set_DACOutPut(DAC_A, DeviceData.DAC_Data.Channel_1);
逻辑分析仪波形截取
抓取芯片DIN和SCLK引脚波形