Я работаю над проектом, который требует связи SPI в одном направлении и от Arduino Uno-Master- до PIC24F16KA301-slave-. Я сталкиваюсь с проблемой, когда мой SPI1BUF всегда читает 255 / 0xFF. Я проверил сигнал SPI, выходящий из Arduino на осциллографе, и все выглядит хорошо с сигналами SS / SCK / MOSI.
Соединения контактов: PI C - Контакт Arduino 18 - контакт 10 Вывод SS 16 (SDO1) - вывод 11 MOSI, вывод 15 - вывод 13 SCK У меня есть Arduino SPI в режиме 1: режим 1 - тактовая частота обычно низкая, CPOL = 0, и данные выбираются при переходе от высокого к low-trailing edge-CPHA = 1
Я опрашиваю бит SPIRBF для проверки принятого байта в al oop, включаю светодиод и затем очищаю бит, читая буфер. Затем я проверяю значение буфера, которое всегда равно 255.
Мне удалось настроить PI C в качестве ведущего устройства, а Arduino - в качестве ведомого и успешно отправить и получить данные с теми же контактами.
Я также пытался подключить MOSI arduino к SDI1 и PI C, но тогда SPIRBF никогда не устанавливается / данные не принимаются.
Есть мысли по поводу того, почему это может быть?
Файл полного кода прилагается. Ниже мой SPI настроен.
// SPI1CON1 Register (Register 16-2)
_DISSCK = 0; // Enable SPI clock on SCK1 pin
_DISSDO = 0; // Enable SDO1 (MOSI) pin (pin 16)
_MODE16 = 0; // Communication is byte-wide (8 bits)
_CKE = 1; // Serial output data changes on
// transition from active to idle
_SSEN = 1; // SS pin
_CKP = 0; // Idle state for clock is low, active state is high
_MSTEN = 0; // Master mode
_SPRE = 0b110; // Secondary prescale 2:1
_PPRE = 0b10; // Primary prescale 4:1
// SPI1CON2 Register (Register 16-3)
_FRMEN = 0; // Framed SPI support disabled
_SPIBEN = 0; // Enhanced buffer disabled (legacy mode)
_SMP = 0;
// SPI1STAT Register (Register 16-1)
_SPIROV = 0; // Clear overflow flag
_SPIEN = 1; // Enable SPI module
и моя основная функция
configure_SPI1();
// Configure pin 14 (RA6) as an input to be used
// as the SS* pin
ANSA = 0; // set all A as digital
ANSB = 0; //
_TRISB12 = 1;
_TRISB13 = 1;
_TRISB14 = 1;
_TRISB15 = 1;
_TRISA6 = 1; // input
///set all pins as inputs
_TRISA0 = 0; // output
_TRISA1 = 0; // output
SPI1BUF = 0;
int x;
while(1){
if(SPI1STATbits.SPIRBF){
x=SPI1BUF;
_LATA0 = 1;
_LATA1 = 1;
__delay_ms(100);
_LATA0 = 0;
_LATA1 = 0;
if(x==255){
_LATA0 = 0;
_LATA1 = 1;
__delay_ms(100);
}
}else{
_LATA0 = 0;
_LATA1 = 0;
}
}
return 1;
}
Дайте мне знать. Спасибо Оливер