Other Parts Discussed in Thread: ADS8688
Tool/software:
你好:
我现在正在使用 MSPM0G3507-Q1 芯片的 SPI 功能;下面是我的函数介绍,我设置 MSPM0G3507-Q1 为主机,设 ADS8688 为 slave,主机发送命令代码(0x00000000,0xA0000000),数据从 slave 机器收集并返回给主机。以上就是我预期的过程,但是在使用过程中,我无法收到机器返回的数据(准确地说,我在程序中设置了接收中断,并在中断中添加了断点验证,进入中断是正常的,但是我无法读取 RxData 寄存器中的数据, 我检测到 RXFIFO 的状态,它显示为非空)。我在从机中使用示波器 PICO、POCI、CLK、CS 引脚显示波形是否正确。造成这种情况的原因是什么?如何处理呢?
下面是我的程序代码和示波器图片的一部分
//Initial configuration of SPI
void SPI0_INIT()
{
//设置时钟源和分频
mySPI0->CLKSEL.bit.SYSCLK_SEL=1;
mySPI0->CLKDIV.bit.RATIO=0;
mySPI0->CTL0.bit.CSSEL=1; //CS线的选择
mySPI0->CTL0.bit.DSS=0xF; //数据尺寸
mySPI0->CTL0.bit.SPH=1; //极性相位
mySPI0->CTL0.bit.SPO=0;
mySPI0->CTL0.bit.FRF=1; //传输帧格式,
mySPI0->CTL1.bit.PES=0; //偶数奇偶校验模式
mySPI0->CTL1.bit.CP=1; //控制器或外设模式选择
mySPI0->CTL1.bit.PTEN=0; //发送奇偶校验
mySPI0->CTL1.bit.PREN=0; //接收奇偶校验
mySPI0->CTL1.bit.MSB=1; //传输的开始端,高位优先
//串行时钟分频器:用于产生SPI的发送和接收比特率
mySPI0->CLKCTL.bit.SCR=0xE;
//设置RX和TX FIFO中断阈值级别
mySPI0->IFLS.bit.RXIFLSEL=0x2;
mySPI0->IFLS.bit.TXIFLSEL=0x2;
//使能接收中断
//mySPI0->C_IMASK.reg=0xFF;
//mySPI0->C_IMASK.bit.TXEMPTY=1;
mySPI0->C_IMASK.bit.IDLE=1;
mySPI0->C_IMASK.bit.RX=1;
//mySPI0->C_IMASK.bit.RXFULL=1;
//mySPI0->C_IMASK.bit.DMA_DONE_RX=1;
//使能
mySPI0->CTL1.bit.ENABLE=1;
}
//Interrupt part
switch (mySPI0->C_IIDX.bit.STAT)
{
case 0x4: //接收中断
{
ALLFC.P01.FC[10]++;//mySPI0->C_IMASK.reg;
SPI.RxCount--;
SPI.RxDataW[SPI.RxCount]=mySPI0->RXDATA;
if(SPI.RxCount==0)
{
ALLFC.P01.FC[11]++;
SPI.TimeOut=0;
SPI_RX();
}
break;
}
//Sending part
void SPI_TX32(Uint32 _Data) //SPI发送函数
{
if(SPI.Busy) return;
SPI.TxD32=_Data;
SPI.TxCount=2;
SPI.RxCount=2;
mySPI0->TXDATA = SPI.TxDataW[1];
mySPI0->TXDATA = SPI.TxDataW[0];
SPI.Busy=5;
}