//*****************************************************************************
//文件名:TLV5638_softSPI.c
//文件功能:低速双路12位DA驱动函数库
//Joye.
//2017.7.19
//*****************************************************************************
#include "hardware/TLV5638_softSPI.h"
/*******************************************
函数名称:TLV5638_WriteData
功 能:发送一个16位二进制数据
参 数:uint Data----16位二进制数据
返回值 :无
********************************************/
void TLV5638_WriteData(uint32_t Data)
{
uint8_t Index;
SPI_CS_CLR;
SPI_SCLK_SET;
for(Index=0;Index<16;Index++)
{
if( (Data & 0x8000) ==0)
SPI_DIN_CLR;
else
SPI_DIN_SET;
SPI_SCLK_CLR;
SysCtlDelay(1);
Data<<=1;
SPI_SCLK_SET;
}
SPI_CS_SET;
}
/*******************************************
函数名称: TLV5638_VoltToData
功 能:将模拟电压值转换为16位二进制数
参 数:Vol----模拟电压值
返回值 :16位二进制数
********************************************/
uint32_t TLV5638_VoltToData(float Vol) //说明REF_VOL为参考源Vol为输出模拟电压值
{
int Temp;
Temp=(uint32_t)((Vol*4095)/(2*REF_VOL));
return(Temp&0x0fff);
}//将电压值转换为对应的12位数字量函数
/*******************************************
函数名称: TLV5638_Write_A
功 能:像A通道写数据
参 数:Vol----模拟电压值
返回值 :无
补充://(uint)(out_volt*4095)/(2*2.048) 先将电压值转化为0~4095的整数
//0x0fff& 转化成16位二进制数,后12位为数据位
//0xc000| 前面加上4位为1100(命令位):快速模式,正常功耗,写数据到A通道
********************************************/
void TLV5638_Write_A(float Vol)
{
int Data;
Data=0xc000|TLV5638_VoltToData(Vol);//A通道
TLV5638_WriteData(Data);
}
/*******************************************
函数名称: TLV5638_Write_B
功 能:像B通道写数据
参 数:Vol----模拟电压值
返回值 :无
补充://(uint)(out_volt*4095)/(2*2.048) 先将电压值转化为0~4095的整数
//0x0fff& 转化成16位二进制数,后12位为数据位
//0xc000| 前面加上4位为1100(命令位):快速模式,正常功耗,写数据到A通道
********************************************/
void TLV5638_Write_B(float Vol)
{
int Data;
Data=0x4000|TLV5638_VoltToData(Vol);//B通道
TLV5638_WriteData(Data);
}
/*******************************************
函数名称:TLV5638_Init
功 能:初始化SPI总线
参 数:无
返回值 :无
********************************************/
void TLV5638_Init(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL);//使能GPIO外设
GPIODirModeSet(GPIO_PORTL_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3,GPIO_DIR_MODE_OUT);
GPIOPadConfigSet(GPIO_PORTL_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3,GPIO_STRENGTH_8MA,GPIO_PIN_TYPE_STD);
SPI_CS_SET;
SysCtlDelay(3);
SPI_SCLK_SET;
SysCtlDelay(3);
SPI_DIN_CLR;
SysCtlDelay(3);
TLV5638_WriteData(INTERNAL_2);//内部2.048参考电压
}
/*******************************************
函数名称:SPI_WriteByte
功 能:向SPI总线写一个字节数据
参 数:date-一个字节数据
返回值 :无
********************************************/
void SPI_WriteByte(uint8_t date)
{
uint8_t Inedx;
SPI_CS_CLR;
SPI_SCLK_SET;
for(Inedx=0;Inedx<8;Inedx++)
{
if( (date & 0x80) ==0)
SPI_DIN_CLR;
else
SPI_DIN_SET;
SPI_SCLK_CLR;
date<<=1;
SPI_SCLK_SET;
}
SPI_CS_SET;
}
/*******************************************
函数名称:SPI_ReadByte
功 能:从SPI总线读一个字节数据
参 数:无
返回值 :所读的一个字节
********************************************/
uint8_t SPI_ReadByte()
{
uint8_t Inedx,ByteToRead=0;
SPI_CS_CLR;
SPI_DIN_MI;
for(Inedx=0;Inedx<8;Inedx++)
{
SPI_SCLK_CLR;
Delay_us(3);
ByteToRead<<=1;
ByteToRead|=SPI_DIN_R;
SPI_SCLK_SET;
Delay_us(3);
}
SPI_SCLK_CLR;
SPI_CS_SET;
SPI_DIN_MO;
return ByteToRead;
}