我正在尝试与raspi进行通信。 拉斯皮是主人,而奴隶是奴隶。 我可以通过SPI将raspi中的字节发送到适当的位置。 但是在DUE方面我需要的是,当我从Raspi接收数据时,我从DUE向Raspi发送了一个新数据。 这是我的代码;
Raspi QT接线pi(主)
#include <wiringPiSPI.h>
#include <QDebug>
#define SPI_CHANNEL 0
#define SPI_CLOCK_SPEED 500000
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
int fd = wiringPiSPISetupMode(SPI_CHANNEL, SPI_CLOCK_SPEED, 0); // Starting SPI
if (fd == -1) {
qDebug() << "Failed to init SPI communication.\n";
return -1;
}
qDebug() << "SPI communication successfully setup.\n";
unsigned char buf[2] = { 1, 2 }; // Char for sending to DUE
wiringPiSPIDataRW(SPI_CHANNEL, buf, 2); // Sending and receiving data
qDebug() << "Data returned: " << buf[0] << buf[1] << "\n";
return a.exec();
}
Arduino DUE代码(从属)
void setup() {
Serial.begin(250000);
//SPI serial recieve
REG_PMC_PCER0 |= PMC_PCER0_PID24; // Power up SPI clock
REG_SPI0_WPMR = 0<<SPI_WPMR_WPEN; //Unlock user interface for SPI
//Instance SPI0, MISO: PA25, (MISO), MOSI: PA26, (MOSI), SCLK: PA27, (SCLK), NSS: PA28, (NPCS0)
REG_PIOA_ABSR |= PIO_ABSR_P25; // Transfer Pin control from PIO to SPI
REG_PIOA_PDR |= PIO_PDR_P25; // Set MISO pin to an output
REG_PIOA_ABSR |= PIO_ABSR_P26; // Transfer Pin control from PIO to SPI
REG_PIOA_PDR |= 0<<PIO_PDR_P26; // Set MOSI pin to an input
REG_PIOA_ABSR |= PIO_ABSR_P27; // Transfer Pin control from PIO to SPI
REG_PIOA_PDR |= 0<<PIO_PDR_P27; // Set SCLK pin to an input
REG_PIOA_ABSR |= PIO_ABSR_P28; // Transfer Pin control from PIO to SPI
REG_PIOA_PDR |= 0<<PIO_PDR_P28; // Set NSS pin to an input
REG_SPI0_CR = 1; // Enable SPI
REG_SPI0_MR = 0; // Slave mode
// Receive Data Register Full Interrupt
SPI0->SPI_IER = SPI_IER_RDRF;
NVIC_EnableIRQ(SPI0_IRQn);
SPI0->SPI_CSR[0] = SPI_CSR_NCPHA|SPI_CSR_BITS_8_BIT;
}
void SPI0_Handler()
{
byte c = SPI0->SPI_RDR;
SPI0->SPI_TDR = c;
}
使用这些代码,我可以成功地从Raspberry发送字符到DUE,但只能从DUE接收“ 0 0”。 但是,如果我在Raspberry pi上将MOSI和MISO引脚连接在一起,则无法成功接收/返回“ 1 2”
编辑: 我用arduino MEGA更改了arduino DUE,并在步步高上使用了“ SLAVE”草图... GAMMON SLAVE SKETCH 当然,覆盆子方面没有任何变化,并且一切正常。 所以问题出在应有的一面....
答案 0 :(得分:0)
我检查了到期的数据表。 寄存器有一些错误。您可以尝试以下方法:
void setup() {
Serial.begin(115200);
while(!Serial);
//SPI serial recieve
REG_PMC_PCER0 |= PMC_PCER0_PID24; // Power up SPI clock
REG_SPI0_WPMR = 0<<SPI_WPMR_WPEN; //Unlock user interface for SPI
//Instance SPI0, MISO: PA25, (MISO), MOSI: PA26, (MOSI), SCLK: PA27, (SCLK), NSS: PA28, (NPCS0)
REG_PIOA_ABSR &= ~PIO_ABSR_P25; // Transfer Pin control from PIO to SPI
REG_PIOA_PDR |= PIO_PDR_P25; // disable pio to control this pin (MOSI)
REG_PIOA_ABSR &= ~PIO_ABSR_P26; // Transfer Pin control from PIO to SPI
REG_PIOA_PDR |= PIO_PDR_P26; // disable pio to control this pin (MOSI)
REG_PIOA_ABSR &= ~PIO_ABSR_P27; // Transfer Pin control from PIO to SPI
REG_PIOA_PDR |= PIO_PDR_P27; // disable pio to control this pin (SCLK)
REG_PIOA_ABSR &= ~PIO_ABSR_P28; // Transfer Pin control from PIO to SPI
REG_PIOA_PDR |= PIO_PDR_P28; //disable pio to control this pin (NSS)
REG_SPI0_CR = 1; // Enable SPI
REG_SPI0_MR = 0; // Slave mode
SPI0->SPI_IER = SPI_IER_RDRF; //Receive Data Register Full Interrupt
NVIC_EnableIRQ(SPI0_IRQn);
SPI0->SPI_CSR[0] = SPI_CSR_NCPHA|SPI_CSR_BITS_8_BIT; // Shift on falling edge and transfer 8 bits.
Serial.println("START");
}
bool flag=false;
uint16_t DataReceived;
void SPI0_Handler()
{
uint32_t status = SPI0->SPI_SR;
if (status & SPI_SR_RDRF){
DataReceived = SPI0->SPI_RDR & SPI_RDR_RD_Msk;
flag=true;
}
if (status & SPI_SR_TDRE) {
SPI0->SPI_TDR = (uint16_t)DataReceived;
}
}
void loop() {
if(flag){
flag=false;
Serial.println(DataReceived);
}
}