最近,在搞SPI与AD7843通讯,采用外部中断采样,通过对DIN/DOUT/DCLK三个脚,用示波器抓波形,发现,SPI通讯有问题,波形上没有输出和输入。程序如下:
void InitGpio(void)
{
GpioCtrlRegs.GPBPUD.bit.GPIO54 = 0;
GpioCtrlRegs.GPBQSEL2.bit.GPIO54 = 3;
GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 1; // SPI SIMOA
GpioCtrlRegs.GPBPUD.bit.GPIO55 = 0;
GpioCtrlRegs.GPBQSEL2.bit.GPIO55 = 3;
GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 1; // SPI SOMIA
GpioCtrlRegs.GPBPUD.bit.GPIO56 = 0;
GpioCtrlRegs.GPBQSEL2.bit.GPIO56 = 3;
GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 1; // SPI CLK
}
/*******************************************************************************
* Function Name : InitSpi
* Description : Initialize spi model
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void InitSpi(void)
{
InitSpia();
}
/*******************************************************************************
* Function Name : InitSpia
* Description : Initialize spia model
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void InitSpia(void)
{
SpiaCtlInit();
}
/*******************************************************************************
* Function Name : SpiaCtlInit
* Description : Initialize spia ctrl model
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void SpiaCtlInit(void)
{
EALLOW;
SpiaRegs.SPICCR.bit.CLKPOLARITY = 1; /* 移位时钟极性,下降输出,上升输入 */
SpiaRegs.SPICCR.bit.SPILBK = 0; /* no loopback mode */
SpiaRegs.SPICCR.bit.SPICHAR = 0x7; /* 字长控制位 */
SpiaRegs.SPICTL.bit.OVERRUNINTENA = 0; /* 溢出错误中断 */
SpiaRegs.SPICTL.bit.CLK_PHASE = 0; /* SPI时钟相位移动,半个时间的偏移量 */
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1; /* 设置为主机设备 */
SpiaRegs.SPICTL.bit.TALK = 1; /* 使能发送 */
SpiaRegs.SPICTL.bit.SPIINTENA = 0; /* 不需要SPI中断,由外部中断配置 */
SpiaRegs.SPIBRR = 0x007F; /* 37.5Mhz/(7F+1) ~= 293khz */
SpiaFifoInit();
SpiaRegs.SPICCR.all = 0x0087;
EDIS;
}
/*******************************************************************************
* Function Name : SpiaFifoInit
* Description : Initialize spia fifo model
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void SpiaFifoInit(void)
{
EALLOW;
SpiaRegs.SPIFFTX.bit.SPIRST = 1; /* reset */
SpiaRegs.SPIFFTX.bit.SPIFFENA = 1; /* 增强FIFO */
SpiaRegs.SPIFFTX.bit.TXFIFO = 1; /* 重新使能接收FIFO操作 */
SpiaRegs.SPIFFTX.bit.TXFFST = 0;
SpiaRegs.SPIFFTX.bit.TXFFINT = 0; /* disable fifo interrupt */
SpiaRegs.SPIFFTX.bit.TXFFINTCLR = 1; /* clear interrupt flag */
SpiaRegs.SPIFFTX.bit.TXFFIENA = 0; /* FIFO 中断使能位 */
SpiaRegs.SPIFFTX.bit.TXFFIL = 0;
SpiaRegs.SPIFFRX.bit.RXFFOVF = 0;
SpiaRegs.SPIFFRX.bit.RXFFOVFCLR = 0; /* no affect */\
SpiaRegs.SPIFFRX.bit.RXFIFORESET = 1; /* reset */
SpiaRegs.SPIFFRX.bit.RXFFST = 0;
SpiaRegs.SPIFFRX.bit.RXFFINT = 0;
SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 1; /* clear int flag */
SpiaRegs.SPIFFRX.bit.RXFFIENA = 0; /* disable 匹配 */
SpiaRegs.SPIFFRX.bit.RXFFIL = 0xF;
SpiaRegs.SPIFFCT.all = 0x08;
EDIS;
}
/*******************************************************************************
* Function Name : InitTouchScreen
* Description : Initialize touch screen model
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void InitTouchScreen(void)
{
int16 bit;
/* 初始化SPI */
InitSpi();
bit = Arch_AD7843_PROBE();
if(bit == 0x0800)
{
return;
}
else
{
/* 报错处理 */
}
}
/*******************************************************************************
* Function Name : Arch_AD7843_PROBE
* Description : read AD7843 output ID
* Input : None
* Output : None
* Return : bit: ID值
*******************************************************************************/
INT16 Arch_AD7843_PROBE()
{
uchar hbit,lbit;
AD7843_CS_SET(0);
asm(" RPT #20 || NOP");
ARCH_SPI_XMIT_NOSLP(AD7843_CMD_PROBE);
while(!ARCH_SPI_XMIT_DONE())
ARCH_SPI_XMIT_NOSLP(0xFF);
while(!ARCH_SPI_XMIT_DONE());
hbit = ARCH_SPI_RECV();
ARCH_SPI_XMIT_NOSLP(0xFF);
while(!ARCH_SPI_FIFO_PENDING());
lbit = ARCH_SPI_RECV();
AD7843_CS_SET(1);
return (((hbits & 0x7F) << 5) | ((lbits & 0xF8) >> 3));
}
现在,我只是想将IC的ID号,也就是100000000000读取出来,时钟对了,但是,不明白,为什么没有输入输出,SPI好像也没有问题,不明白问题出在哪里,有没有试着搞过这方面技术的,望指教。
(PS:前两天把CAN给调成功了,坑爹的TI例程,波特率的预分频居然还是9,坑的不是一点两点啊!!!)
@zhangmangui 有没有这方面的建议性资料,急需。:lol |