SPI Arduino (ведущий) в PIC24 (ведомый) получает проблему, буфер всегда 255? - PullRequest
0 голосов
/ 22 февраля 2020

Я работаю над проектом, который требует связи 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;
}

Дайте мне знать. Спасибо Оливер

...