Other Parts Discussed in Thread: TMS320F28379D,
您好,
我在用TMS320F28379D利用SPI通信控制DAC1282输出直流电压,示波器观察SPICLK和SPISIMO正常,周期为12.5us。

但SPISOMI始终为低电平,debug界面也读取不出SPISOMI的值,请问这是什么原因?
下面是我的程序。
/*
* DAC读取调试
*
*/
#include "F28x_Project.h"
typedef unsigned char Uint8;
//声明
void gpio_init();//配置所有与PCB板相连的GPIO口(包括3线SPI)
void spia_init();
void dac_init();
void spia_xmit(Uint8 a);
Uint8 rdata;
void main()
{
//初始化
InitSysCtrl();//系统控制
InitGpio();//GPIO
DINT;//关中断
InitPieCtrl();//PIE控制寄存器
IER = 0x0000;//中断标志位清零
IFR = 0x0000;//中断标志位清零
InitPieVectTable();//中断向量表
gpio_init();//配置所有与PCB板相连的GPIO口(包括3线SPI)
spia_init();
dac_init();
spia_xmit(0x20);//读GANMOD寄存器地址
DELAY_US(100);
spia_xmit(0x00);//读一个寄存器
DELAY_US(100);
while(SpiaRegs.SPISTS.bit.INT_FLAG != 1){}
rdata = SpiaRegs.SPIRXBUF;
}
void gpio_init()
{
/* GPIO 连接端口 I/O 初始值
* 111 GPIO_CS_DA O 0
* 60 SPICLKA_DA SPIA CLK
* 59 SPISOMIA_DA SPIA SOMI
* 58 SPISIMOA_DA SPIA SIMO
* 22 GPIO_SW/TD_DA O 0
*/
EALLOW;
//CS、SW/TD、RESET、DRDY
GpioCtrlRegs.GPDPUD.bit.GPIO111 = 0;
GpioCtrlRegs.GPDMUX1.bit.GPIO111 = 0;
GpioCtrlRegs.GPDDIR.bit.GPIO111 = 1;
GpioDataRegs.GPDCLEAR.bit.GPIO111 = 1;//GPIO_CS_DA
GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0;
GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO22 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO22 = 1;//GPIO_SW/TD_DA
//SPI
//DA(使能、异步、SPI)
GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;
GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3;
GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3;//SPICLKA_DA
GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;
GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;
GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3;
GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3;//SPISOMIA_DA
GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;
GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;
GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3;
GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3;//SPISIMOA_DA
EDIS;
}
void spia_init()
{
//DAC1282时钟极性(CPOL)为0,时钟相位(CPHA)为0
//配置控制寄存器(8位保留,0000 0000 0000 0111 = 0x0007)
SpiaRegs.SPICCR.bit.SPISWRESET = 0;//SPI复位
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;//时钟极性为0(SCK空闲为低电平)
SpiaRegs.SPICCR.bit.HS_MODE = 0;//关闭高速模式
SpiaRegs.SPICCR.bit.SPILBK = 0;//关闭回环模式
SpiaRegs.SPICCR.bit.SPICHAR = (8-1);//字长8位
//运行控制寄存器(11位保留,0000 0000 0000 0110 = 0x0016)
SpiaRegs.SPICTL.bit.OVERRUNINTENA = 1;//禁止接收溢出中断
SpiaRegs.SPICTL.bit.CLK_PHASE = 0;//时钟相位为0(在第一个跳变沿采样)
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;//MCU主机
SpiaRegs.SPICTL.bit.TALK = 1;//使能主机发送
SpiaRegs.SPICTL.bit.SPIINTENA = 0;//禁止SPI中断
//SpiaRegs.SPISTS.all = 0;
//波特率寄存器(9位保留,0000 0000 0000 007C)
/*
* LSPCLKfreq=CPUfreq/n //(n=1,2,4,6,8,10,12,14)
* SPI Baud Rate=LSPCLKfreq/(SPIBRR+1)
* 在不添加外部辅助时钟的情况下
* F28379D的CPU频率为10MHz,对应最低低速外设时钟为715KHz,最低波特率为5586SPS
* 此最低波特率大于选择FIR滤波器模式 时的最高波特率4000SPS
* 故选择Sinc滤波器模式 ,波特率设置为8000SPS,10分频,SPIBRR=124=0x007C
*/
EALLOW;
ClkCfgRegs.LOSPCP.all = 0x0005;//101(10分频)
EDIS;
SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 0x007C;
//优先级控制寄存器
SpiaRegs.SPIPRI.bit.FREE = 1;//仿真时自由运行,断点上暂停不会停止SPI
//停止SPI软件复位准备接收或发送
SpiaRegs.SPICCR.bit.SPISWRESET = 1;
}
//2、外置元件初始配置(DAC、ADC)
void dac_init()
{
spia_xmit(0x40);//写入GANMOD寄存器地址
DELAY_US(100);
spia_xmit(0x00);//写一个寄存器
DELAY_US(100);
spia_xmit(0x0D);//写入0000 1101,GAIN=8,DC模式
DELAY_US(100);
//SINEG寄存器不配置
spia_xmit(0x42);//写入SWM寄存器地址
DELAY_US(100);
spia_xmit(0x00);//写一个寄存器
DELAY_US(100);
spia_xmit(0x10);//写入0001 0000,开关全开实现差分
DELAY_US(100);
//N寄存器不配置
spia_xmit(0x44);//写入DCG寄存器地址
DELAY_US(100);
spia_xmit(0x02);//写入三个寄存器
DELAY_US(100);
spia_xmit(0xE9);//DCG0
DELAY_US(100);
spia_xmit(0x26);//DCG1
DELAY_US(100);
spia_xmit(0x31);//DCG2
DELAY_US(100);
//PULSE寄存器不配置
}
void spia_xmit(Uint8 a)
{
SpiaRegs.SPITXBUF = (Uint16)(a<<8);//将8位数据传到串行发送缓冲
}