SPI Clock on PIC нестабильный


8

Я пытаюсь настроить модуль MSSP PIC18F25K22 в основной режим SPI. Я смотрю на время, и часы не остаются стабильными на протяжении всей передачи. Картинка показывает это лучше, чем слова. Временная диаграмма SPI

После отправки бита часы укорачиваются, и каждый раз не на одну и ту же величину. Я раньше не работал с SPI, но диаграммы, которые я нашел в Википедии и других ресурсах, никогда не показывают этого. Я также подключил Arduino и не видел этого поведения. Мой код:

    #pragma config FOSC = INTIO67   // Oscillator Selection bits (Internal oscillator block)
#pragma config PLLCFG = OFF     // 4X PLL Enable (Oscillator used directly)
#pragma config BOREN = OFF      // Brown-out Reset Enable bits (Brown-out Reset disabled in hardware and software)
#pragma config WDTEN = OFF      // Watchdog Timer Enable bits (Watch dog timer is always disabled. SWDTEN has no effect.)
#pragma config MCLRE = EXTMCLR  // MCLR Pin Enable bit (MCLR pin enabled, RE3 input pin disabled)
#pragma config LVP = OFF        // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))

void main(void)
{
    OSCCON = 0b11100110;
    spi_setup();
    __delay_ms(10);
    byte temp;
    while (TRUE)
    {
        temp = spi_transfer(0x00);
        temp = spi_transfer(0x01);
        temp = spi_transfer(0x02);
        temp = spi_transfer(0x03);
        temp = spi_transfer(0x04);
        temp = spi_transfer(0x05);
        __delay_us(1);
    }
}

void spi_setup(void)
{
    SSP1STAT = 0b00000000;
    SSP1STATbits.CKE = HIGH; // data transmitted on rising edge
    SSP1CON1 = 0b00000000; // enable Master SPI mode
    SSP1CON1bits.CKP1 = LOW; //clock idle state is low
    //i2c bits, all don't matters for SPI, cleared just in case
    SSP1CON3 = 0;
    // baud rate generation
    SSP1ADD = 0; //FCLOCK = 8Mhz /2 = 2Mhz
    // configure pins for output/input as needed 
    SDI1 = INPUT;
    SDO1 = OUTPUT;
    SCK1 = OUTPUT;
    SS1 = OUTPUT;
    SSP1CON1bits.SSPEN1 = HIGH; // enable pins for serial mode
}

unsigned char spi_transfer(unsigned char data)
{
    SS1_LAT = LOW; // select slave
    PIR1bits.SSPIF = LOW;
    SSP1BUF = data;
    //while (!SSP1STATbits.BF); //wait for receive to complete
    while( !PIR1bits.SSPIF );
    SS1_LAT = HIGH; // deselect slave
    PIR1bits.SSPIF = LOW;   // clear interrupt
    return SSP1BUF; //return data from the slave
}

(также https://gist.github.com/stumpylog/5095250 )

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

Что я сделал

В конце концов, я не смог заставить работать модуль MSSP1. Тем не менее, изменение его на модуль MSSP2, точно такой же код, не демонстрирует такое поведение. Я не могу это объяснить, но это решило проблему.


Можете ли вы показать свой код для использования SPI?
Густаво Литовский

1
Как правило, SPI (и I2C тоже) будет работать с неоднородными часами. SPI является синхронным. В то же время кажется странным, что аппаратный MSSP генерирует неоднородные часы. Когда линия данных (зеленая) низка, ваши часы единообразны. Когда линия данных высока, ваши часы короче. На всякий случай проверьте исправления для вашего PIC.
Ник Алексеев

@GustavoLitovsky Я добавил код прямо к вопросу сейчас.
Трентон Холмс

@NickAlexeev Спасибо, я посмотрел на это. Ничего не сказано о модуле MSSP. Я должен проверить, может ли мой раб управлять временем, как есть.
Трентон Холмс

Возможно, это не связано с вашей проблемой, но я не вижу кода для очистки битов ANSEL для ваших портов. Microchip сделал досадный выбор, если по умолчанию контакты будут аналоговыми входами, а не цифровыми.
Апалопохапа

Ответы:


3

Это предположение, но вы, вероятно, сбрасываете то, что не должны быть каждым байтом. Такие вещи, как генератор битовой скорости и общая периферийная конфигурация, должны быть установлены только один раз.

Добавлено:

Теперь вы говорите, что не можете заставить работать MSSP1, но работаете. Это намекает на то, что у вас есть ошибка в другом месте кода, который делает непреднамеренные записи. Случается, что он достигает некоторого состояния MSSP1, поэтому он действует странным образом и почему MSSP2 работает.

Не просто отпустить это. Переход на MSSP2 может решить проблему, но в лучшем случае вы обошли ее, возможно, временно. В следующий раз, когда вы будете связываться с вещами в разных местах, может быть нацарапана другая память. Если вы не найдете и действительно исправите это, эта прошивка будет вечно нестабильной. Наихудший случай - когда нет явных симптомов, делающих вам одолжение, чтобы дать понять, что есть проблема. Проблема появится через год, когда будут найдены только правильные данные, только клиентские сайты, после 1000 находятся в поле. ИСПРАВИТЬ ЭТО ПРАВО СЕЙЧАС.


2

Похоже, что у вас могут быть проблемы с целостностью сигнала - на снимке в Лос-Анджелесе появляется линия с часами, когда линия данных падает. Попробуйте убедиться, что они хорошо изолированы, а трасса или проводка не слишком длинные. Вы также пытаетесь уменьшить тактовую частоту или добавить небольшой RC-фильтр на линии (если линии длинные, может помочь только последовательный резистор, скажем, 220 Ом)

Если у вас есть осциллограф, проверьте линии с этим, чтобы убедиться, что целостность сигнала хорошая. Если это не так, попробуйте приведенные выше предложения и отрегулируйте их до тех пор, пока не получите сигналы хорошего качества.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.