pinda_ 发表于 2014-4-19 10:12

【讨论】F28835 SPI与AD7843通讯

      最近,在搞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

pinda_ 发表于 2014-4-19 10:13

#define AD7843_CMD_PROBE                                0xE0        // 0x800 expected!
#define ARCH_SPI_XMIT_NOSLP(cmd)                 SpiaRegs.SPITXBUF = (cmd)
#define ARCH_SPI_XMIT_DONE()                        (SpiaRegs.SPISTS.bit.INT_FLAG)
#define ARCH_SPI_RECV()                                        (SpiaRegs.SPIRXBUF)
#define ARCH_SPI_FIFO_PENDING()                (SpiaRegs.SPIFFRX.bit.RXFFST)

附上宏定义。

zhangmangui 发表于 2014-4-20 23:38

没时间研究啦    帮忙顶顶

pinda_ 发表于 2014-4-23 15:18

zhangmangui 发表于 2014-4-20 23:38 static/image/common/back.gif
没时间研究啦    帮忙顶顶

嗯,我又一次钻入了,不知道这一次能不能出来:dizzy:

pinda_ 发表于 2014-4-24 16:20

:D出来了,代码暂时不能公布,我还要再做一些测试,如果有相关问题,可以发问。(:L公司的要保密)
页: [1]
查看完整版本: 【讨论】F28835 SPI与AD7843通讯