Jam SPI pada PIC tidak stabil

8

Saya mencoba mengkonfigurasi modul MSSP dari PIC18F25K22 ke mode master SPI. Saya melihat waktu dan jam tidak tetap stabil melalui seluruh transmisi. Gambar menunjukkan lebih baik daripada kata-kata. Diagram Waktu SPI

Setelah sedikit dikirim, jam lebih pendek, dan tidak dengan jumlah yang sama setiap kali. Saya belum pernah bekerja dengan SPI sebelumnya, tetapi diagram yang saya temukan di Wikipedia dan sumber daya lainnya tidak pernah menunjukkan ini. Saya juga menghubungkan Arduino dan tidak melihat perilaku ini. Kode saya adalah:

    #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
}

(juga https://gist.github.com/stumpylog/5095250 )

Adakah yang menemukan ini atau memiliki saran mengenai penyebabnya?

Apa yang saya lakukan

Pada akhirnya, saya tidak dapat mengaktifkan modul MSSP1. Namun, mengubahnya ke modul MSSP2, kode yang sama persis, tidak menunjukkan perilaku ini. Saya tidak bisa menjelaskannya, tetapi ini menyelesaikan masalah.

Trenton Holmes
sumber
Bisakah Anda menunjukkan kode Anda untuk menggunakan SPI?
Gustavo Litovsky
1
Secara umum, SPI (dan I2C juga) akan bekerja dengan jam yang tidak seragam. SPI sinkron. Pada saat yang sama, tampaknya aneh bahwa perangkat keras MSSP menghasilkan jam yang tidak seragam. Ketika garis data (hijau) rendah, jam Anda seragam. Ketika jalur data tinggi, jam Anda lebih pendek. Untuk jaga-jaga, periksa errata untuk PIC Anda.
Nick Alexeev
@GustavoLitovsky Saya telah menambahkan kode langsung ke pertanyaan sekarang.
Trenton Holmes
@NickAlexeev Terima kasih, saya telah melihatnya. Tidak ada yang disebutkan tentang modul MSSP. Saya harus memeriksa apakah budak saya dapat menangani pengaturan waktunya.
Trenton Holmes
Mungkin tidak terkait dengan masalah Anda, tetapi saya tidak melihat kode untuk menghapus bit ANSEL untuk port Anda. Microchip telah membuat pilihan yang menyebalkan yaitu pin menjadi input analog secara default, bukan digital.
apalopohapa

Jawaban:

3

Ini dugaan, tetapi Anda mungkin mengatur ulang sesuatu yang tidak seharusnya Anda per byte. Hal-hal seperti generator laju bit dan konfigurasi periferal umum hanya boleh ditetapkan satu kali.

Ditambahkan:

Anda sekarang mengatakan bahwa Anda tidak bisa membuat MSSP1 berfungsi tetapi berhasil membuat MSSP2 berfungsi. Itu mengisyaratkan bahwa Anda memiliki bug di tempat lain dalam kode yang melakukan penulisan yang tidak diinginkan. Itu terjadi untuk memukul beberapa negara MSSP1, itulah sebabnya ia bertindak aneh dan mengapa MSSP2 berfungsi.

Jangan biarkan ini pergi. Pindah ke MSSP2 mungkin tampaknya telah memperbaiki masalah, tetapi yang terbaik Anda telah mengatasinya, mungkin sementara. Lain kali Anda terhubung dengan hal-hal di tempat yang berbeda, memori yang berbeda dapat ditulis. Jika Anda tidak menemukan dan benar-benar memperbaiki ini, firmware ini akan selamanya rapuh. Kasus terburuk adalah ketika tidak ada gejala yang jelas membantu Anda untuk membuatnya jelas ada masalah. Masalahnya kemudian akan muncul setahun kemudian ketika hanya data yang tepat ditemukan, hanya situs pelanggan, setelah 1000 berada di lapangan. TETAPKAN CARA YANG BENAR INI SEKARANG.

Olin Lathrop
sumber
2

Sepertinya Anda mungkin memiliki masalah integritas sinyal - pada pemotretan LA, nampak garis jam glitches ketika garis data jatuh. Coba pastikan keduanya terisolasi dengan baik, dan jejak atau kabel tidak terlalu panjang. Anda juga mencoba memperlambat laju jam turun atau menambahkan filter RC kecil pada garis (jika garis panjang, hanya serangkaian resistor katakan 220Ω dapat membantu)

Jika Anda memiliki osiloskop, periksa garis dengan ini untuk memastikan integritas sinyal baik. Jika tidak, coba saran di atas dan sesuaikan hal-hal sampai Anda memiliki sinyal berkualitas baik.

Oli Glaser
sumber