我尝试用spi通讯为两台28335做沟通,但不论怎么发送讯号,从设备就是无法从spirxbuf读取到值,能否有人能给予一段最简单spi沟通编码?
感谢!!
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.
我尝试用spi通讯为两台28335做沟通,但不论怎么发送讯号,从设备就是无法从spirxbuf读取到值,能否有人能给予一段最简单spi沟通编码?
感谢!!
您的意思是将LOOPBACK禁用就行了吗?
我是使用TI本身的历程去改,他是采用自传自受的测试程序。
我有将这个屏蔽,但依然无法传讯。
想请问一个问题,在1对1的情况下片选脚是主从设备都能直接接地吗?
因为我之前是对接。
我的写法
主设备:用一个无线回圈,发送一个固定的值,如0x1111
从设备:rdata = SpiaRegs.SPIRXBUF;想读取值,但开启rdata来看,出现讯息为identifier not found:rata 求解
打错,都是rdata
想请问,我主设备用无线回圈发送同一个讯号会是导致从设备收不到讯号的原因吗?
就是用一个FOR回圈不断发送讯号给从设备。
loopback模式指的应该是将SPICCR中的SPILBK设成环路返回模式,对吗?
我有将它禁用了,但从设备依然收不到讯号
有关FIFO能帮我解释一下吗?它对于SPI来说,它的功能是什么?重要性在哪?
第一次摸SPI,还请板上不吝啬解答,感谢。
主:
sdata = 0x5555;
FOR( ; ; )
{ spi_xmit(sdata);
while(SpiaRegs.SPIFFRX.bit.RXFFST!=1) { }
rdata = SpiaRegs.SPIRXBUF;
}
从:
FOR( ; ; )
{
rdata = SpiaRegs.SPIRXBUF;
}
大概像这样简单的设定
主:
void spi_init()
{
SpiaRegs.SPICCR.all =0x000F; // Reset on, rising edge, 16-bit char bits
SpiaRegs.SPICTL.all =0x0006; // Enable master mode, normal phase,
// enable talk, and SPI int disabled.
SpiaRegs.SPIBRR =0x007F;
SpiaRegs.SPICCR.all =0x008F; // Relinquish SPI from Reset
SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission
}
void spi_fifo_init()
{
// Initialize SPI FIFO registers
SpiaRegs.SPIFFTX.all=0xE040;
SpiaRegs.SPIFFRX.all=0x204f;
SpiaRegs.SPIFFCT.all=0x0;
}
从设备就只是将主从模式改成从模式而已
我看了一下 你可以试着这么改一下:
主设备:
for(;;)
{
sdata = 0x5555;
spi_xmit(sdata);
while(SpiaRegs.SPIFFTX.bit.TXFFST !=0) { }
}
void spi_init()
{
SpiaRegs.SPICCR.all =0x000F; // Reset on, rising edge, 16-bit char bits
SpiaRegs.SPICTL.all =0x0006; // Enable master mode, normal phase,
// enable talk, and SPI int disabled.
SpiaRegs.SPIBRR =0x007F;
SpiaRegs.SPICCR.all =0x008F; // Relinquish SPI from Reset
SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission
}
void spi_fifo_init()
{
// Initialize SPI FIFO registers
SpiaRegs.SPIFFTX.all=0xE040;
SpiaRegs.SPIFFRX.all=0x204f;
SpiaRegs.SPIFFCT.all=0x0;
}
从设备:
for(;;)
{
while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { }
rdata = SpiaRegs.SPIRXBUF;
}
void spi_init()
{
SpiaRegs.SPICCR.all =0x000F; // Reset on, rising edge, 16-bit char bits
SpiaRegs.SPICTL.all =0x0002; // Enable master mode, normal phase,
// enable talk, and SPI int disabled.
SpiaRegs.SPIBRR =0x007F;
SpiaRegs.SPICCR.all =0x00CF; // Relinquish SPI from Reset
SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission
}
void spi_fifo_init()
{
// Initialize SPI FIFO registers
SpiaRegs.SPIFFTX.all=0xE040;
SpiaRegs.SPIFFRX.all=0x204f;
SpiaRegs.SPIFFCT.all=0x0;
}
感谢!!不过因为有一台设备送修,等设备回来我再来做测试,再把结果与大家分享
"为了保证稳定性,建议将两块DSP共地,接至电源的0V"能稍为解释吗?
DSP的电源不是有特殊的供电线吗?
测试了一下,从设备的RDATA显示的值是49208。
可是我传的是5555和6666。
求解!
感谢,可以连接了。可是我再传送0x2222这个值时,另一台DSP会收到0x2222或0x4444或0x8888。
会是因为两台DSP不ˋ同时间启动,所以造成资料传送的问题吗?
谢谢你,之前都没注意到你有回复,抱歉抱歉。
我试试看后再来分享结果。
想请问一下
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1; // Configure GPIO16 as SPISIMOA
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1; // Configure GPIO17 as SPISOMIA
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1; // Configure GPIO18 as SPICLKA
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1; // Configure GPIO19 as SPISTEA
EDIS;
编译里,需要加入上叙这段吗?
在主编译里有一段 InitSpiaGpio();
我有去DSP2833x_spi.c里看,想请问这段用意为何?
InitSpiaGpio();这个函数的意思就是初始化SPIA的管脚。
在spi.c文件中,就有你之前复制的那段语句
GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1; // Configure GPIO16 as SPISIMOA
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1; // Configure GPIO17 as SPISOMIA
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1; // Configure GPIO18 as SPICLKA
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1; // Configure GPIO19 as SPISTEA
拿GPIO16举例,查阅28335的DATASHEET可以知道,GPIO16管脚为"GPIO16/SPISIMOA/CANTXB/TZ5"这些功能,因此当GPAMUX2.bit.GPIO=0时,是作GPIO管脚,当=1时,是SPISIMOA功能,当=2时,是CANTXB功能,=3时是TZ5功能。
其余管脚类似配置。
因此InitSpiaGpio();这个函数的用意就是将管脚配置为SPIA功能
这我懂,可是我不太懂为什么它要将所有功能都开启一次?
另外也就是说,如果有这段InitSpiaGpio();我就不必额外编译已下这段啰?
GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1; // Configure GPIO16 as SPISIMOA
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1; // Configure GPIO17 as SPISOMIA
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1; // Configure GPIO18 as SPICLKA
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1; // Configure GPIO19 as SPISTEA
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0; // Enable pull-up on GPIO16 (SPISIMOA)
GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0; // Enable pull-up on GPIO17 (SPISOMIA)
GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0; // Enable pull-up on GPIO18 (SPICLKA)
GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0; // Enable pull-up on GPIO19 (SPISTEA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3; // Asynch input GPIO16 (SPISIMOA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3; // Asynch input GPIO17 (SPISOMIA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3; // Asynch input GPIO18 (SPICLKA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3; // Asynch input GPIO19 (SPISTEA)
GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1; // Configure GPIO16 as SPISIMOA
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1; // Configure GPIO17 as SPISOMIA
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1; // Configure GPIO18 as SPICLKA
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1; // Configure GPIO19 as SPISTEA
EDIS;
在InitSpiaGpio();有以上这段编译,它的功能为?
我之前测试能透过SPI在两台DSP传送数据,但不知道为何,最近不论如何调整, 在从设备rdata = SpiaRegs.SPIRXBUF;rdata一直都是65535,可能是哪出了问题?还是数据传送上,根本没有传送出去?
for(;;)
{
while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { }
rdata = SpiaRegs.SPIRXBUF;
}
void delay_loop()
{
long i;
for (i = 0; i < 1000000; i++) {}
}
void error(void)
{
asm(" ESTOP0"); // Test failed!! Stop!
for (;;);
}
void spi_init()
{
SpiaRegs.SPICCR.all =0x000F; // Reset on, rising edge, 16-bit char bits
SpiaRegs.SPICTL.all =0x0002; // Enable master mode, normal phase,
// enable talk, and SPI int disabled.
SpiaRegs.SPIBRR =0x007F;
SpiaRegs.SPICCR.all =0x00CF; // Relinquish SPI from Reset
SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission
}
void spi_xmit(Uint16 a)
{
SpiaRegs.SPITXBUF=a;
}
void spi_fifo_init()
{
// Initialize SPI FIFO registers
SpiaRegs.SPIFFTX.all=0xE040;
SpiaRegs.SPIFFRX.all=0x204f;
SpiaRegs.SPIFFCT.all=0x0;
}
这是我从设备的编译程式,基本上是按照之前你提供的配置
至于主设备,我有量过,讯号输出应该是没有什么太大问题
请问while(SpiaRegs.SPIFFTX.bit.TXFFST !=0) { } 有关这判断句使用时机?
不是很了解!=0或者!=1的差别,0或1的意思是?
TXFFST和RXFFST都是表示FIFO的数目,假设你一下子往FIFO中写16个数,那么TXFFST就等于16,直到FIFO中的数都发送完成之后,TXFFST才为0。同样的,对于RXFFST而言,每收到一个数,RXFFST的值加1。
while(SpiaRegs.SPIFFTX.bit.TXFFST !=0) { } 等待发送完成
while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { } 等待直到收到一个数
while(SpiaRegs.SPIFFRX.bit.RXFFST !=16) { } 等待直到收到16个数