Other Parts Discussed in Thread: C2000WARE
您好,
我今天尝试用示波器测试SPI通讯时序,分别测试了SPIA自收自发和SPIA主SPIB从的通讯。
SPIA自收自发测试时CCS debug界面显示正常。示波器测SCLK如下图,8个脉冲为一组,单个脉冲宽度为12.4us(高低电平时间均为6.2us),但是每组脉冲之间会有31.4us的时间间隔,请问这是正常现象吗?
测量SIMO引脚发现它会持续发送同一数据,测量时间大概为32.3ms,约重复发送数据243次,请问这该如何解决?
下面是SPIA自收自发的程序:
/* * SPI自收自发 * */ #include "F28x_Project.h" typedef unsigned char Uint8; //声明 void gpio_init();//配置所有与PCB板相连的GPIO口(包括3线SPI) void spia_init(); void spia_xmit(Uint8 a); //全局变量 char sdata; char rdata; void main() { //初始化 InitSysCtrl();//系统控制 InitGpio();//GPIO DINT;//关中断 InitPieCtrl();//PIE控制寄存器 IER = 0x0000;//中断标志位清零 IFR = 0x0000;//中断标志位清零 InitPieVectTable();//中断向量表 gpio_init();//配置所有与PCB板相连的GPIO口(包括3线SPI) spia_init(); sdata = 0x0045; for(;;) { spia_xmit(sdata); while(SpiaRegs.SPISTS.bit.INT_FLAG != 1){} rdata = SpiaRegs.SPIRXBUF; sdata++; } } void gpio_init() { /* GPIO 连接端口 I/O 初始值 * 60 SPICLKA_DA SPIA CLK * 59 SPISOMIA_DA SPIA SOMI * 58 SPISIMOA_DA SPIA SIMO */ EALLOW; //SPI //DA(使能、异步、SPI) GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0; GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3; GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3; GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3;//SPICLKA GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0; GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3; GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3; GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3;//SPISOMIA GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0; GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3; GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3; GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3;//SPISIMOA 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 = 1;//关闭回环模式 SpiaRegs.SPICCR.bit.SPICHAR = (8-1);//字长8位 //运行控制寄存器(11位保留,0000 0000 0000 0110 = 0x0006) 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; } void spia_xmit(Uint8 a) { SpiaRegs.SPITXBUF = a;//将8位数据传到串行发送缓冲 }
SPIA主SPIB从测试时将SPIA CLK-SPIB CLK、SPIA SIMO-SPIB SOMI、SPIA SOMI-SPIB SIMO连接,测试SCLK波形与SPIA自收自发相同,但debug界面显示正常运行一段时间后,rdata始终为FFFF,SpiaRegs.SPISTS.bit.INT_FLAG始终为1,跳不出while循环,请问这应该怎么解决?
下面是SPIA主SPIB从的程序:
/*
* SPI主从测试
*
*/
#include "F28x_Project.h"
typedef unsigned char Uint8;
//声明
void gpio_init();//配置所有与PCB板相连的GPIO口(包括3线SPI)
void spia_init();
void spia_xmit(Uint8 a);
void spib_init();
void spib_xmit(Uint8 a);
//全局变量
char sdata;
char rdata;
int i;
void main()
{
//初始化
InitSysCtrl();//系统控制
InitGpio();//GPIO
DINT;//关中断
InitPieCtrl();//PIE控制寄存器
IER = 0x0000;//中断标志位清零
IFR = 0x0000;//中断标志位清零
InitPieVectTable();//中断向量表
gpio_init();//配置所有与PCB板相连的GPIO口(包括3线SPI)
spia_init();
spib_init();
sdata = 0x0000;
rdata = 0x0000;
for(;;)
{
spia_xmit(sdata);
while(SpibRegs.SPISTS.bit.INT_FLAG != 1){}
rdata = SpibRegs.SPIRXBUF;
sdata++;
}
}
void gpio_init()
{
/* GPIO 连接端口 I/O 初始值
* 60 SPICLKA_DA SPIA CLK
* 59 SPISOMIA_DA SPIA SOMI
* 58 SPISIMOA_DA SPIA SIMO
*
* 65 SPICLKB_AD SPIB CLK
* 64 SPISOMIB_AD SPIB SOMI
* 63 SPISIMOB_AD SPIB SIMO
*/
EALLOW;
//SPI
//DA(使能、异步、SPI)
GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;
GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3;
GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3;//SPICLKA
GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;
GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;
GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3;
GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3;//SPISOMIA
GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;
GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;
GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3;
GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3;//SPISIMOA
//SPI
//DA(使能、异步、SPI)
GpioCtrlRegs.GPCPUD.bit.GPIO65 = 0;
GpioCtrlRegs.GPCQSEL1.bit.GPIO65 = 3;
GpioCtrlRegs.GPCMUX1.bit.GPIO65 = 3;
GpioCtrlRegs.GPCGMUX1.bit.GPIO65 = 3;//SPICLKB
GpioCtrlRegs.GPCPUD.bit.GPIO64 = 0;
GpioCtrlRegs.GPCQSEL1.bit.GPIO64 = 3;
GpioCtrlRegs.GPCMUX1.bit.GPIO64 = 3;
GpioCtrlRegs.GPCGMUX1.bit.GPIO64 = 3;//SPISOMIB
GpioCtrlRegs.GPBPUD.bit.GPIO63 = 0;
GpioCtrlRegs.GPBQSEL2.bit.GPIO63 = 3;
GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 3;
GpioCtrlRegs.GPBGMUX2.bit.GPIO63 = 3;//SPISIMOB
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 = 1;//关闭回环模式
SpiaRegs.SPICCR.bit.SPICHAR = (8-1);//字长8位
//运行控制寄存器(11位保留,0000 0000 0000 0110 = 0x0006)
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;
}
void spib_init()
{
//DAC1282时钟极性(CPOL)为0,时钟相位(CPHA)为0
//配置控制寄存器(8位保留,0000 0000 0000 0111 = 0x0007)
SpibRegs.SPICCR.bit.SPISWRESET = 0;//SPI复位
SpibRegs.SPICCR.bit.CLKPOLARITY = 0;//时钟极性为0(SCK空闲为低电平)
SpibRegs.SPICCR.bit.HS_MODE = 0;//关闭高速模式
SpibRegs.SPICCR.bit.SPILBK = 1;//关闭回环模式
SpibRegs.SPICCR.bit.SPICHAR = (8-1);//字长8位
//运行控制寄存器(11位保留,0000 0000 0000 0110 = 0x0006)
SpibRegs.SPICTL.bit.OVERRUNINTENA = 1;//禁止接收溢出中断
SpibRegs.SPICTL.bit.CLK_PHASE = 0;//时钟相位为0(在第一个跳变沿采样)
SpibRegs.SPICTL.bit.MASTER_SLAVE = 0;//MCU从机
SpibRegs.SPICTL.bit.TALK = 1;//使能主机发送
SpibRegs.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;
SpibRegs.SPIBRR.bit.SPI_BIT_RATE = 0x007C;
//优先级控制寄存器
SpibRegs.SPIPRI.bit.FREE = 1;//仿真时自由运行,断点上暂停不会停止SPI
//停止SPI软件复位准备接收或发送
SpibRegs.SPICCR.bit.SPISWRESET = 1;
}
void spia_xmit(Uint8 a)
{
SpiaRegs.SPITXBUF = a;//将8位数据传到串行发送缓冲
}
期待并感谢您的回答。