This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

f28035 关于SPI 通信 程序目 读取外部18位数据

f28035 关于SPI 通信 程序目 读取外部18位数据 ,应为SPI 最长支持 16 位,所有本人想用 FIFO 同时送2个9位的数据出去。程序如下

初始化程序

{
s->***.bit.SPISWRESET = 0; // Put SPI in reset state
s->***.bit.*** = 0x8; // 9-bit character
s->***.bit.SPILBK = 0; // loopback off
s->***.bit.CLKPOLARITY = 1; // Rising edge without delay

s->***.bit.SPIINTENA = 0; // disable SPI interrupt
s->***.bit.TALK = 1; // enable transmission
s->***.bit.MASTER_SLAVE = 1; // master
s->***.bit.CLK_PHASE = 0; // Rising edge without delay
s->***.bit.OVERRUNINTENA = 0; // disable reciever overrun interrupt

s->SPIBRR = 20; // *** = LSPCLK / 4 (max ***)

s->SPIPRI.bit.SOFT=1; //停止前完成当前的接收 、发送操作
s->SPIPRI.bit.FREE=0;

s->SPIFFTX.bit.TXFFST=2; //发送FIFO具有2个字

s->SPIFFRX.bit.RXFFST=2; //接收FIFO具有2个字

s->***.bit.SPISWRESET=1; // Enable SPI
}

下面是输出的读入程序

{
s->SPITXBUF = 1; //send out the data
s->SPITXBUF = 1; //send out the data

while(s->SPISTS.bit.INT_FLAG == 0); //wait for the packet to complete

stat_reg1 = s->SPIRXBUF; //dummy read to clear the INT_FLAG bit
stat_reg2 = s->SPIRXBUF;

}

  • 进过测试,发现。这个程序 要求输出9*2=18位的 数据,但是在连续相 (s->SPITXBUF = 1; //send out the data
    s->SPITXBUF = 1; //send out the data) 写2个9位的数据,结果 发现 输出了 9*3=27个时钟信号。

    如果每次穿一个

    (s->SPITXBUF = 1; //send out the data

    while(s->SPISTS.bit.INT_FLAG == 0);

     s->SPITXBUF = 1; //send out the data

    ) while(s->SPISTS.bit.INT_FLAG == 0);,能输出2* 9个脉冲

    请高手给指教一下

  • 目的是为了传输 一个18位的数据,应为 SPI 最多只支持16 位,所有就想用传 2个9 位输出 来合成一个18位的数据,上门的出现 测试以后发现,输出了27位数据。

    是哪个地方出了问啊啊

  • 有没有那个技术支持一下啊啊 

  • 我没发现错误。


    不应该发送 输出了 9*3=27个时钟信号。是否是算错了?如下面这样写的话是否能只看到18个?

    {
    s->SPITXBUF = 1; //send out the data
    s->SPITXBUF = 1; //send out the data

    while(s->SPISTS.bit.INT_FLAG == 0); //wait for the packet to complete

     for(i=0;i<1000;i++);

    stat_reg1 = s->SPIRXBUF; //dummy read to clear the INT_FLAG bit
    stat_reg2 = s->SPIRXBUF;

    }

  • 我试一试你的方法,你看见我的设置了吧。看设置是不是有问题

  • 经过实际测试 发现在  需要 在等待中断后 加一点延时,如果不加延时也会出错。

  • 现在又遇到一个问题, 

    stat_reg1 = s->SPIRXBUF; //dummy read to clear the INT_FLAG bit
    stat_reg2 = s->SPIRXBUF;

    读出来的是一样的。

    目的应该要重 从机读出 一个18 位的 数据

  • 通过以上的修改,加入延时程序以后,可以输出准确的18个脉冲,

    但是 用过上面的程序读取 输入回来的数据,发现是一样的。

    stat_reg1 = s->SPIRXBUF; //dummy read to clear the INT_FLAG bit
    stat_reg2 = s->SPIRXBUF

    我这程序里面还有一个10KHZ 的中断程序

    请教技术支持!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  • 请在程序中允许FIFO。否则前面的数据会被后面的数据覆盖。

    SpiaRegs.SPIFFTX.bit.SPIFFENA=1;

  • 通过上面一些方法的 测试,现在出现 已经可以 输出连续的18个脉冲时钟, 从设备也你能 正常回传 18位的数据,

    现在的 初始化和 读程序如下。

    但是还是发现了一个问题,依然没有解决,就是 通过读输入的 数据,发现 2个临时变量的 数据是一样的。

    程序如下:

    s->SPICCR.bit.SPISWRESET = 0; // Put SPI in reset state
    s->SPICCR.bit.SPICHAR = 0x8; // 9-bit character//////////////////
    s->SPICCR.bit.SPILBK = 0; // loopback off
    s->SPICCR.bit.CLKPOLARITY = 1; // Rising edge without delay

    s->SPICTL.bit.SPIINTENA = 0; // disable SPI interrupt
    s->SPICTL.bit.TALK = 1; // enable transmission
    s->SPICTL.bit.MASTER_SLAVE = 1; // master
    s->SPICTL.bit.CLK_PHASE = 0; // Rising edge without delay
    s->SPICTL.bit.OVERRUNINTENA = 0; // disable reciever overrun interrupt

    s->SPIBRR = 20; // SPICLK = LSPCLK / 4 (max SPICLK)

    s->SPIPRI.bit.SOFT=1; //停止前完成当前的接收 、发送操作
    s->SPIPRI.bit.FREE=0; //

    s->SPIFFTX.bit.TXFFST=2; //发送FIFO具有2个字///////////////////
    //s->SPIFFTX.bit.TXFFIL=2;

    s->SPIFFRX.bit.RXFFST=2; //接收FIFO具有2个字///////////////
    //s->SPIFFRX.bit.RXFFIL=2;
    s->SPIFFTX.bit.TXFFIENA=1; ////发送FIFO中断使能//////////////////
    s->SPIFFRX.bit.RXFFIENA=1; ///接收FIFO 中断使能

    s->SPICCR.bit.SPISWRESET=1; // Enable SPI

    下面是 通信程序。

    s->SPITXBUF = 0; //send out the data
    s->SPITXBUF = 0; //send out the data

    while(s->SPISTS.bit.INT_FLAG == 0); //wait for the packet to complete
    for(i=0;i<10;i++);

    stat_reg1 = s->SPIRXBUF;
    stat_reg2 = s->SPIRXBUF;

    以上数据通过示波器观察已经确定。 现在依然是 读回的2个数据一样。、

    在两个读入中间加 延时倒是可以读取,

    stat_reg1 = s->SPIRXBUF;

    for(i=0;i<100;i++);
    stat_reg2 = s->SPIRXBUF;

    但是因为程序里面有 1个10Khz 的中断。要产生,还是会产生读出的 数据会有错误

    因为s->SPISTS.bit.INT_FLAG 中断标志的产生会在每个数据接收9位完都会产生,

    所以,要想读取 18位数据,就需要分2次读取。如果这2次读取的数据间隔时间短,就会出现2次读回一样的数据。

    如个使用2个FIFIO 来保持接收的数据,不知道是否可以。现在程序也已经定了2个FIFO 但是在数据读取方面还是不行

  • 我试了一下,能够正常读取,2个数据不一样。附件是我试的程序,是在TI的例程基础上改的,您请看一下。

  • 我测试一下,看能否正常工作。