pic32 получает только 1 байт в spi

Я борюсь, наверное, с очень простой проблемой. У меня есть контроллер Cypress CY8, выступающий в качестве ведущего SPI, который должен обмениваться данными с PIC32mx в подчиненном режиме для обмена пакетами данных.

Однако я даже не могу исправить простую передачу нескольких байтов от ведущего к подчиненному. Я установил кипарис для передачи символа возрастающего значения (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-данные постоянно передаются обратно на кипарис, я думаю, что что-то пошло не так с чтением / очисткой структуры spi-данных в PIC. Но я не могу понять, почему. Как я прочитал в таблице данных, чтение из SPI2BUFF дает мне полученные данные и очищает флаги чтения, чтобы можно было получать новые данные, но, похоже, этого не происходит...

Может ли кто-нибудь пролить свет на это для меня?

Заранее спасибо Timberleek

1 ответ

Вы должны попытаться сделать свой обработчик 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();
}
Другие вопросы по тегам