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的spi模块中,我直接给spitxbuf寄存器赋值,它会激发spi的发送功能,数据会在spidat移位寄存器中逐位的发送给spisimo引脚;
1、现在我想用FIFO寄存器不知道给怎样给发送fifo寄存器赋值
2、txfifo寄存器和txbuf和spidat寄存器之间是个什么样的关系
3、使用fifo寄存器后,怎样确定上一次的数据已经发送完成,我好写入下一次的数据
是一级一级传数的,我该怎样向这个fifo寄存器赋值呢, 我没有找到 ,txbuf是一个16位的寄存器,我可以往里面写数,但是往fifo寄存器里面写,找不到该操作的寄存器,是不是fifo需要自己构建这样一个功能?谢谢
谢谢您,我试着调了一下一下程序,从机可以收到数据,但是不是正确的数据,发生了覆盖,我看了一下spidat寄存器一只是满的0xffff,我是在中断里面给txbuf赋值的,怎样才能确保不会发生覆盖,还有我在fifo中断等级中设置的8,看到datasheet上面说当fifo中的数据等于或者小于8个的时候会发生中断,请问这代表着什么意思,谢谢!
你的从机也要使用FIFO模式接收,SPIDAT只在传输的过程中变化,数据传输过程中而你又无法实时的查看。“看到datasheet上面说当fifo中的数据等于或者小于8个的时候会发生中断”,原文是什么?
上面我表达错了,我明天早晨查好了,再向您请教
我现在有一个很着急的程序,不知道该怎么处理,我有一个10k的中断,我想在这个中断里面用spi把数据发给从机,每隔10k中断更新要发送的数据,我现在的状况是发生数据错位,不知道使用fifo发送数据,该怎么处理,谢谢,有些着急,请见谅!
其实我的意思是,对于SPIFFTX寄存器中的0~4位TXFFIL0~4可以设置fifo transmit的中断等级,当fifo状态位 TXFFST4-0小于或者等于前面设置的TXFFIL0~4时,会发生中断;
我不清楚上面是一种怎样的逻辑,而且当这种fifo中断作用,结合我自己使用的需求,该怎样用?我现在在10k中断中产生数据,但是我想10K的速度往外发,因为从机接收速度没有这么高,所以我就想把数据打包,例如:我积攒10次中断的数据,发送一次,这样的发送方式应该是必须用到txfifo,相当于我积攒10次,激活一次fifo发送数据,等这10次的数据发送完成后,在往里面存10次的数据,这种需求该怎样结合上面的fifo发送中断实现呢,项目催的急,请您见谅,期待你的解答,谢谢!
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中写入数据
}
请您看看,逻辑上我有点混论,请您帮忙理清一下。谢谢!