gpt4 book ai didi

c - pic32在spi中只接收1个字节

转载 作者:行者123 更新时间:2023-11-30 17:12:14 24 4
gpt4 key购买 nike

我可能正在努力解决一个非常简单的问题。我有一个 Cypress CY8 Controller 作为 SPI 主 Controller ,它应该在从模式下与 PIC32mx 通信以交换数据包。

但是我什至无法修复从主机到从机的多个字节的简单传输。我已经将 cypress 设置为传输一个递增值 (0-255) 的字符,中间有一个暂停(和从机选择切换)。图片应该读取传入的字节,然后通过 uart 将其打印到我的电脑(uart 连接有效)。但图片只打印它连续接收到的第一个字符,而不是更新它。如果我检查我的逻辑嗅探器,柏树确实发送递增值,并且图片通过 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 数据不断地转发回 cypress 时,我认为读取/清除 PIC 中的 spi 数据结构出现了问题。但我不明白为什么。正如我在数据表中阅读的那样,从 SPI2BUFF 读取会为我提供接收到的数据,并清除读取标志,以便可以接收新数据,但看起来这种情况不会发生......

有人可以帮我解释一下吗?

提前致谢廷伯利克

最佳答案

您应该尝试让您的 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();
}

关于c - pic32在spi中只接收1个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31678633/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com