DSP

da芯片 tlc5620的程序(spi)

2019-07-13 14:46发布

** 实验说明:主要硬件由DSP和TLV5620组成,DSP提供了SIMO和SCLK、C3TRIP **
**           信号给TLV5620,且C3TRIP信号是用来做片DAC信号的更新和锁 **
**           存的,这里大家要参照TLV5602的手册,4个信道 **
**           的DAC输出分别引了出来,方便大家来检测.这里还要说明的一 **


#include "DSP28_Device.h" /*这里使用了宏定义来控制更新锁存信号的功能,重点就是在时序上*/
#define SetLOAD GpioDataRegs.GPADAT.bit.GPIOA15=1; //将LOAD置高
#define ClrLOAD GpioDataRegs.GPADAT.bit.GPIOA15=0; //将LOAD置低 void WriteDAC(unsigned char add,unsigned char rng,unsigned char vol);
void delay(unsigned int t); void main(void)
{  
 int temp;
   
 /*初始化系统*/
 InitSysCtrl();
 
 /* 关中断 */
 DINT;
 IER = 0x0000;
 IFR = 0x0000;
 
 /* 初始化PIE控制寄存器 */
 InitPieCtrl();
 
 /* 初始化PIE参数表 */
 InitPieVectTable(); 
 
 ///初始化IO口
 InitGpio();
 
 ///初始化SPI
    InitSpi();  EINT;    // Enable Global interrupt INTM
 ERTM;  // Enable Global realtime interrupt DBGM     SetLOAD; //把刷新锁存控制信号拉高
           
    temp=57;
 
    while(1)
    {
        
         WriteDAC(0,0,temp);  //0.4V
   
         WriteDAC(1,0,temp*2); //0.8V          WriteDAC(2,0,temp*3); //1.2V          WriteDAC(3,0,temp*4); //1.6V          delay(1000); //在此设断点,观察变量DAC0和DAC1的值,另外加三用表直接测量四路DA的输出电压值
 } }    
void WriteDAC(unsigned char add,unsigned char rng,unsigned char vol)
{  
 unsigned short int data;
    data=0x0000;
    ///大家要知道这里所定义的各个变量的含义,add是4个通道的地址(00,01,10,11)
    ///                                     RNG是输出范围的倍数,可以是0或1。1的话结果*2
    ///                                     VOL是0~256数据
   
     data = ((add<<14) | (rng<<13) | (vol<<5));
     //注意这里的有效数据是11位,SPI初始化中也进行了定义,且txbuff是右对齐
   //两位地址+一位rng+8位数据=11位,spi设定了11位
    if(Spi_TxReady() == 1)   //判断SPI的发送缓冲区是否是空的,等于1可写数据
    
       SpiaRegs.SPITXBUF = data; //把发送的数据写如SPI发送缓冲区     while( Spi_TxReady()!=1);  //当发送缓冲区出现满标志位时,下面开始琐存数据
     
 delay(1000);//同通过一负跳变琐存要发送的数据,看TLV5620数据手册即可得知
    ClrLOAD;
   
 delay(100);
    SetLOAD;
   
    delay(1000); 
} void delay(unsigned int t)
{
 
  while(t>0)
     t--;
}   void InitSpi(void)
{
 // Initialize SPI-A:
  EALLOW;
 SpiaRegs.SPICCR.all = 0x0a;///进入初始状态,数据在上升沿输出,自测禁止,11位数据模式
 
 SpiaRegs.SPICTL.all = 0x06;   //主动模式,禁止中断
 
 SpiaRegs.SPIBRR = 0x1D;//波特率 = LSPCLK/(SPIBRR+1)= 30/30 = 1M
 
 SpiaRegs.SPICCR.all = 0x8a; //退出初始状态
 
  EDIS;
 
} unsigned int Spi_TxReady(void)///SPI发送准备函数
{
 unsigned int i;
 if(SpiaRegs.SPISTS.bit.BUFFULL_FLAG == 1)///缓冲区标志位满,可发送数据
 {
  i = 0;
 }
 else
 {
  i = 1;
 }
 return(i);
} /*SPI接收准备函数,此程序没有用到*/
unsigned int Spi_RxReady(void)
{
 unsigned int i;
 if(SpiaRegs.SPISTS.bit.INT_FLAG == 1)
 {
  i = 1;
 }
 else
 {
  i = 0;
 }
 return(i); 
}
//===========================================================================
// No more.
//===========================================================================