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.

F28335 FIFO寄存器使用

Other Parts Discussed in Thread: CONTROLSUITE

在F28335的spi模块中,我直接给spitxbuf寄存器赋值,它会激发spi的发送功能,数据会在spidat移位寄存器中逐位的发送给spisimo引脚;

1、现在我想用FIFO寄存器不知道给怎样给发送fifo寄存器赋值

2、txfifo寄存器和txbuf和spidat寄存器之间是个什么样的关系

3、使用fifo寄存器后,怎样确定上一次的数据已经发送完成,我好写入下一次的数据

  • 关于SPI FIFO的使用,你可以参考controlsuite中的例程:C:\ti\controlSUITE\device_support\f2833x\v141\DSP2833x_examples_ccsv5\spi_loopback_interrupts 。FIFO,TXBUF,SPIDAT之间仍是一级一级的传递,fifo发送完之后会触发FIFO中断,你可以在中断程序中写下一次数据。

  • 是一级一级传数的,我该怎样向这个fifo寄存器赋值呢, 我没有找到 ,txbuf是一个16位的寄存器,我可以往里面写数,但是往fifo寄存器里面写,找不到该操作的寄存器,是不是fifo需要自己构建这样一个功能?谢谢

  • spi_loopback_interrupts在这个例程中,也是给txbuf写入数据的,并没有往fifo里面写数据啊,请您再讲详细一下?谢谢

  • TXBUF和FIFO的地址是相同的,在使用FIFO模式时,往TXBUF写数据,其实就是向FIFO写数据。

  • 谢谢您,我试着调了一下一下程序,从机可以收到数据,但是不是正确的数据,发生了覆盖,我看了一下spidat寄存器一只是满的0xffff,我是在中断里面给txbuf赋值的,怎样才能确保不会发生覆盖,还有我在fifo中断等级中设置的8,看到datasheet上面说当fifo中的数据等于或者小于8个的时候会发生中断,请问这代表着什么意思,谢谢!

  • 你的从机也要使用FIFO模式接收,SPIDAT只在传输的过程中变化,数据传输过程中而你又无法实时的查看。“看到datasheet上面说当fifo中的数据等于或者小于8个的时候会发生中断”,原文是什么?

  • 上面我表达错了,我明天早晨查好了,再向您请教

    我现在有一个很着急的程序,不知道该怎么处理,我有一个10k的中断,我想在这个中断里面用spi把数据发给从机,每隔10k中断更新要发送的数据,我现在的状况是发生数据错位,不知道使用fifo发送数据,该怎么处理,谢谢,有些着急,请见谅!

  • 这样的话你需要稍微修改下程序,disable SPI中断,然后在你的10K中断中查看SPI中断标志位,中断标志位置位后再更新FIFO中的数据。

  • 您的意思是不是不使能spi的txfifo发送中断,但是可以查询到标志位,当有标志位的时候,我在更新要发送的数值;

    但是,您之前说的使用spi fifo模式后,往txbuf中写数据就是向txfifo中写数据 ,只要一往tubuf中写数据,就会激活spiclock时钟,数据就会发送出去了,那我还怎么用txfifo来储存一段数据然后发送出去呢,我想在10K中断中产生的数据存到txfifo中,例如:当发生了10次中断,我存了10次个变量,然后,我再启动发送,相当于把数据打包,告知从机接收数据;因为10K的发送速度,从机接收不了!谢谢您不厌其烦的给我解答问题!

  • 对于上面那段话,是我没有表达清楚

    其实我的意思是,对于SPIFFTX寄存器中的0~4位TXFFIL0~4可以设置fifo transmit的中断等级,当fifo状态位 TXFFST4-0小于或者等于前面设置的TXFFIL0~4时,会发生中断;

    我不清楚上面是一种怎样的逻辑,而且当这种fifo中断作用,结合我自己使用的需求,该怎样用?我现在在10k中断中产生数据,但是我想10K的速度往外发,因为从机接收速度没有这么高,所以我就想把数据打包,例如:我积攒10次中断的数据,发送一次,这样的发送方式应该是必须用到txfifo,相当于我积攒10次,激活一次fifo发送数据,等这10次的数据发送完成后,在往里面存10次的数据,这种需求该怎样结合上面的fifo发送中断实现呢,项目催的急,请您见谅,期待你的解答,谢谢!

  • 你可以通过SPICCR寄存器的reset位来控制SPI的启动和停止。

  • SPIFFTX寄存器中的中断等级通常是直接设置为0,也就是说FIFO中的数据全部发送出去了再触发中断。如果你设置中断level为8,而FIFO的深度设置为10,那么FIFO中的数据发出去两个就会触发中断。

    你的从机接收速度慢是什么意思?你如果要积攒10次那就一直保持SPI reset就好了,积攒够10次再置位reset位开始发送。使用FIFO模式的话,主机和从机都要配置为FIFO模式,一个FIFO发送一个FIFO接收。

  • 按照我理解的您的意思,下面是我对spififo的初始化和我在中断程序里面的发送程序,跪请您看看;

    void spi_fifo_init()
    {

    SpiaRegs.SPICCR.bit.SPISWRESET=0;   //  Reset SPI

     SpiaRegs.SPICCR.all=0x000F;      //  移位寄存器一次可以移出16位,禁用SPI的环路返回模式

    SpiaRegs.SPICTL.all=0x0017;        //  时钟相位没有延时,SPI为主模式,使能4个引脚,spi中断使能

    SpiaRegs.SPISTS.all=0x0000;       //  状态位置零

    SpiaRegs.SPIBRR=0x0024;       //  波特率1M

    SpiaRegs.SPIFFTX.all=0xCF20;       //  fifo深度写 15位,中断等级写0,当发送15位之后,fifo空,发生中断,

    SpiaRegs.SPIFFCT.all=0x00;        //  无延时

    SpiaRegs.SPICCR.bit.SPISWRESET=1;     // Enable SPI   

     SpiaRegs.SPIFFTX.bit.TXFIFO=1;       //写1,再次使能发送FIFO工作

    }

    中断发送程序

    interrupt mianisr()

    SpiaRegs.SPICCR.bit.SPISWRESET=0;  // Reset SPI  不启动发送

    SpiaRegs.SPITXBUF=sdata[j];      // 往fifo中写入数据  

    if(j==16)           // 往fifo中写入了16次数据

    GpioDataRegs.GPBTOGGLE.bit.GPIO57 = 1;   // 将高电平翻转为低电平,拉低片选,使能从机接收

    SpiaRegs.SPICCR.bit.SPISWRESET=1;  // enable SPI  启动发送

     }

    while(SpiaRegs.SPIFFTX.TXFFINT==1);// 判断fifo的中断标志位,说明fifo已经发送为空,

    SpiaRegs.SPITXBUF=sdata[j];      // 再次往fifo中写入数据 

    请您看看,逻辑上我有点混论,请您帮忙理清一下。谢谢!