我正在努力解决一个非常简单的问题。 我有一个Cypress CY8控制器作为SPI主控制器,它应该与从模式的PIC32mx通信以交换数据包。
然而,我甚至无法修复从主设备到从设备的多个字节的简单传输。我已经设置了柏树来传输一个增加值的字符(0-255),其间有一个暂停(和从属选择切换)。 pic应该读取传入的字节,然后通过uart将其打印到我的电脑上(uart连接工作)。 但pic仅打印它连续接收的第一个字符,而不是更新它。 如果我检查我的逻辑嗅探器,柏树确实发送递增值,并且pic通过MISO线将它们中继回来(看起来移位缓冲区没有被清除)。
这可能是什么?
没有附加图片的柏树给出了正确的输出: https://dl.dropboxusercontent.com/u/3264324/Schermafdruk%202015-07-28%2015.43.28.png 随附图片,它通过MISO中继数据: https://dl.dropboxusercontent.com/u/3264324/Schermafdruk%202015-07-28%2015.43.45.png
这是我(现在)非常基本的代码来测试它:
TRISBbits.TRISB2 = 1; // make Ra2 pin input (SDI)
TRISBbits.TRISB5 = 0; // make Ra2 pin output (SDO)
TRISBbits.TRISB15 = 1; //make RB14 output (SCK)
ANSELA = 0; // all ports digital
ANSELB = 0; // all ports digital
SYSKEY = 0x00000000;
SYSKEY = 0xAA996655;
SYSKEY = 0x556699AA;
CFGCONbits.IOLOCK=0; // unlock configuration
CFGCONbits.PMDLOCK=0;
SDI2R = 0b0100; //SDI2 on pin RB2
SS2R = 0b0011; //SS2 on pin rb10
RPB5R = 0b0100; //SDO2 on pin RB5
// SCLK is connected to pin RB14 (SCK) by default
SYSKEY = 0x00000000;
SPI2CON = 0; // Stops and resets the SPI1.
rData=SPI2BUF; // clears the receive buffer
SPI2BRG=207; // use FPB/4 clock frequency <-- not important in slave mode right?
SPI2STATCLR=0x40; // clear the Overflo
SPI2CON=0x8180;
unsigned char t;
while(1){
t = SpiChnReadC(2);
//t = SPI2BUF; <== i've tried this also
sendData(t); <== uart routine
}
当我收到一个字符并且spi数据被不断地传回柏树时,我认为在PIC中读取/清除spi数据结构时出现了问题。但我无法弄清楚为什么。 正如我在数据表中读到的那样,从SPI2BUFF读取给我接收的数据,并清除读取标志,以便可以接收新数据,但看起来不会发生...
有人可以为我照亮这个吗?
提前致谢 Timberleek
答案 0 :(得分:0)
您应该尝试使用SPI处理程序驱动ISR以防止不断轮询,也可以帮助调试,因为您只会在SPI实际进行交易时收到通知。
注意:我从我的FreeRTOS impl中提取这个,所以我的ISR定义不完全是XC32 ...
/* Open SPI */
SPI1CON = 0;
spi_flags = SPICON_MODE32 | SPICON_ON;
SpiChnOpen(1,spi_flags,BRG_VAL);
SpiChnGetRov(1,TRUE);
mSPI1ClearAllIntFlags();
mSPI1SetIntPriority(priority + 1);
mSPI1SetIntSubPriority(0);
mSPI1RXIntEnable(1);
void vSPI1InterruptHandler(void)
{
unsigned long data;
if (IFS0bits.SPI1EIF == 1)
{
mSPI1EClearIntFlag();
}
if (IFS0bits.SPI1RXIF == 1)
{
data = SPI1BUF;
//sendData(data);
}
mSPI1RXClearIntFlag();
}