GD32F303使用笔记——SPI0(一)

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引脚波形
GD32F303使用笔记——SPI0(一)_第1张图片

你可能感兴趣的:(GD32F303,mcu,c语言)