?? spi_dac5617.c
字號:
//===========================================================
//
// 文件名稱:SPI_DAC5617
//
// TITLE: DSP28 SPI - DAC TLV5617A,
// 采用CPU Timer0產(chǎn)生定時周期50ms,輸出鋸齒波
// 使能看門狗,在主函數(shù)中刷新計數(shù)器
//
//===========================================================
#include "DSP281x_Device.h"
// 函數(shù)原形聲明
void Gpio_select(void);
void InitSystem(void);
void SPI_Init(void);
void DAC_Update(char channel,int value);
interrupt void cpu_timer0_isr(void); // 定時器中斷
void main(void)
{
int Voltage_A = 0;
int Voltage_B = 511;
InitSystem(); // 初始化處理器內(nèi)核寄存器
Gpio_select(); // 設(shè)置IO功能
InitPieCtrl(); // 調(diào)用外設(shè)中斷擴展初始化單元 PIE-unit ( 代碼 : DSP281x_PieCtrl.c)
InitPieVectTable(); // 初始化 PIE vector向量表 ( 代碼 : DSP281x_PieVect.c )
// 重新映射 PIE - Timer 0的中斷
EALLOW; // 解除寄存器保護
PieVectTable.TINT0 = &cpu_timer0_isr;
EDIS; // 使能寄存器保護
InitCpuTimers();
// 配置 CPU-Timer 0 周期50 ms:
// 150MHz CPU 頻率, 50000 微妙中斷周期
ConfigCpuTimer(&CpuTimer0, 150, 50000);
// 使能PIE內(nèi)的 TINT0 : Group 1 interrupt 7
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
// 使能 CPU INT 1 (CPU定時器0中斷)
IER = 1;
// 全局中斷使能和更高優(yōu)先級的實時調(diào)試事件
EINT; // 全局中斷使能INTM
ERTM; // 使能實時調(diào)試中斷DBGM
CpuTimer0Regs.TCR.bit.TSS = 0;
SPI_Init();
while(1)
{
while(CpuTimer0.InterruptCount < 3); // 等待定時中斷3次
CpuTimer0.InterruptCount = 0;
DAC_Update('B',Voltage_B);
DAC_Update('A',Voltage_A);
if (Voltage_A++ > 511) Voltage_A = 0;
if (Voltage_B-- < 0) Voltage_B = 511;
EALLOW;
SysCtrlRegs.WDKEY = 0xAA; // 看門狗控制
EDIS;
}
}
void Gpio_select(void)
{
EALLOW;
GpioMuxRegs.GPAMUX.all = 0x0; // 所有GPIO引腳配置為I/O
GpioMuxRegs.GPBMUX.all = 0x0;
GpioMuxRegs.GPDMUX.all = 0x0;
GpioMuxRegs.GPFMUX.all = 0xF;
GpioMuxRegs.GPEMUX.all = 0x0;
GpioMuxRegs.GPGMUX.all = 0x0;
GpioMuxRegs.GPADIR.all = 0x0; // GPIO PORT 配置為輸入
GpioMuxRegs.GPBDIR.all = 0x0; // GPIO PORT 配置為輸入
GpioMuxRegs.GPDDIR.all = 0x0; // GPIO PORT 配置為輸入
GpioMuxRegs.GPDDIR.bit.GPIOD0 = 1; // DAC的/CS使能信號
GpioMuxRegs.GPDDIR.bit.GPIOD6 = 1; // EEPROM的/CS使能信號
GpioMuxRegs.GPEDIR.all = 0x0; // GPIO PORT 配置為輸入
GpioMuxRegs.GPFDIR.all = 0x0; // GPIO PORT 配置為輸入
GpioMuxRegs.GPGDIR.all = 0x0; // GPIO PORT 配置為輸入
GpioDataRegs.GPBDAT.all = 0x0; // GPIO PORT 配置為輸入
GpioDataRegs.GPDDAT.bit.GPIOD0 = 1; // DAC的/CS信號處于無效狀態(tài)
GpioDataRegs.GPDDAT.bit.GPIOD5 = 1; // EEPROM的/CS信號處于無效狀態(tài)
GpioMuxRegs.GPAQUAL.all = 0x0; // 設(shè)置所有 GPIO 輸入的量化值等于0
GpioMuxRegs.GPBQUAL.all = 0x0;
GpioMuxRegs.GPDQUAL.all = 0x0;
GpioMuxRegs.GPEQUAL.all = 0x0;
EDIS;
}
void InitSystem(void)
{
EALLOW;
SysCtrlRegs.WDCR= 0x00AF; // 配置看門狗
// 0x00E8 禁止看門狗,預定標系數(shù)Prescaler = 1
// 0x00AF 不禁止看門狗, 預定標系數(shù)Prescaler = 64
SysCtrlRegs.SCSR = 0; // 看門狗產(chǎn)生復位
SysCtrlRegs.PLLCR.bit.DIV = 10; // 配置處理器鎖相環(huán),倍頻系數(shù)為5
SysCtrlRegs.HISPCP.all = 0x1; // 配置高速外設(shè)時鐘分頻系數(shù): 2
SysCtrlRegs.LOSPCP.all = 0x2; // 配置低速外設(shè)時鐘分頻系數(shù): 4
// 使用的外設(shè)時鐘時鐘設(shè)置:
// 一般不使用的外設(shè)的時鐘禁止,降低系統(tǒng)功耗
SysCtrlRegs.PCLKCR.bit.EVAENCLK=0;
SysCtrlRegs.PCLKCR.bit.EVBENCLK=0;
SysCtrlRegs.PCLKCR.bit.SCIAENCLK=0;
SysCtrlRegs.PCLKCR.bit.SCIBENCLK=0;
SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0;
SysCtrlRegs.PCLKCR.bit.SPIENCLK=1; //使能SPI時鐘
SysCtrlRegs.PCLKCR.bit.ECANENCLK=0;
SysCtrlRegs.PCLKCR.bit.ADCENCLK=0;
EDIS;
}
interrupt void cpu_timer0_isr(void)
{
CpuTimer0.InterruptCount++;
// 每個定時器中斷清除一次看門狗計數(shù)器
EALLOW;
SysCtrlRegs.WDKEY = 0x55; // 看門狗控制
EDIS;
// 響應(yīng)中斷并允許系統(tǒng)接收更多的中斷
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
void SPI_Init(void)
{
SpiaRegs.SPICCR.all = 0x004F;
// Bit 7 , Reset = 0 :
// Bit 6 , 時鐘極性 = 1 : 在SPICLK的下降沿輸出數(shù)據(jù)
// , 結(jié)合相位控制CLOCK PHASE = 1 : 在SPICLK的下降沿半個周期前輸出數(shù)據(jù)
// Bit 5 , 保留
// Bit 4 , SPILBK = 0 :非循環(huán)模式
// Bit 3-0, Chars = 1111 : 16 bit 數(shù)據(jù)傳輸
SpiaRegs.SPICTL.all =0x000E;
// Bit 7-5 : 保留
// Bit 4 , 過載 INT Enable = 0 :禁止接收器過載中斷
// Bit 3 , Clock-Phase = 1 :半個周期的延時
// Bit 2 , Master/Slave = 1 :MASTER模式
// Bit 1 , Talk = 1 :使能傳輸
// Bit 0 , SPI INT ENA = 0 :禁止SPI
SpiaRegs.SPIBRR = 124;
// SPI通信波特率 = LSPCLK / ( SPIBRR + 1)
// = 37,5 MHz / ( 124 + 1 )
// = 300 kHz
SpiaRegs.SPICCR.bit.SPISWRESET = 1; // SPI退出復位
}
void DAC_Update(char channel, int value)
{
int i;
GpioDataRegs.GPDDAT.bit.GPIOD0 = 0; // DAC的/CS有效
if (channel == 'B')
SpiaRegs.SPITXBUF = 0x1000 + (value<<2); // 發(fā)送數(shù)據(jù)到DAC緩沖
if (channel == 'A')
SpiaRegs.SPITXBUF = 0x8000 + (value<<2); // 將數(shù)據(jù)傳送到DAC-A并刷新DAC-B的緩沖
while (SpiaRegs.SPISTS.bit.INT_FLAG == 0) ; // 等待傳輸結(jié)束
for (i=0;i<100;i++); // 等待DAC結(jié)束
GpioDataRegs.GPDDAT.bit.GPIOD0 = 1; // DAC的/CS無效
i = SpiaRegs.SPIRXBUF; // 對SPI接收緩沖空讀操作使SPI復位
}
//===========================================================================
// 代碼結(jié)束
//===========================================================================
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -