Đồng hồ SPI trên PIC không ổn định


8

Tôi đang cố gắng định cấu hình mô-đun MSSP của PIC18F25K22 thành chế độ chính SPI. Tôi đang xem xét thời gian và đồng hồ không duy trì ổn định trong toàn bộ quá trình truyền. Một bức tranh cho thấy nó tốt hơn lời nói. Sơ đồ thời gian SPI

Sau khi gửi một chút, đồng hồ sẽ rút ngắn và không phải cùng một số tiền mỗi lần. Tôi chưa từng làm việc với SPI trước đây, nhưng các sơ đồ tôi đã tìm thấy trên Wikipedia và các tài nguyên khác chưa từng thể hiện điều này. Tôi cũng đã kết nối một Arduino và không thấy hành vi này. Mã của tôi là:

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

(cũng https://gist.github.com/stumpylog/5095250 )

Có ai gặp phải điều này hoặc có gợi ý về nguyên nhân?

Tôi đã làm gì

Cuối cùng, tôi không thể làm cho mô-đun MSSP1 hoạt động. Tuy nhiên, việc thay đổi nó thành mô-đun MSSP2, cùng mã chính xác, đã không thể hiện hành vi này. Tôi không thể giải thích nó, nhưng điều này đã giải quyết vấn đề.


Bạn có thể hiển thị mã của bạn để sử dụng SPI?
Gustavo Litovsky

1
Nói chung, SPI (và I2C cũng vậy) sẽ hoạt động với đồng hồ không đồng nhất. SPI là đồng bộ. Đồng thời, có vẻ kỳ lạ khi MSSP phần cứng tạo ra đồng hồ không đồng nhất. Khi dòng dữ liệu (màu xanh lá cây) thấp, đồng hồ của bạn sẽ đồng nhất. Khi dòng dữ liệu cao, đồng hồ của bạn ngắn hơn. Chỉ trong trường hợp, kiểm tra errata cho PIC của bạn.
Nick Alexeev

@GustavoLitovsky Tôi đã thêm mã trực tiếp vào câu hỏi ngay bây giờ.
Trenton Holmes

@NickAlexeev Cảm ơn, tôi đã xem qua. Không có gì đề cập về mô-đun MSSP. Tôi sẽ phải kiểm tra xem nô lệ của tôi có thể xử lý thời gian như hiện tại không.
Trenton Holmes

Có thể không liên quan đến vấn đề của bạn, nhưng tôi không thấy mã để xóa các bit ANSEL cho các cổng của bạn. Microchip đã đưa ra lựa chọn khó chịu là có các chân là đầu vào tương tự theo mặc định thay vì kỹ thuật số.
apalopohapa

Câu trả lời:


3

Đây là một phỏng đoán, nhưng có lẽ bạn đang đặt lại một cái gì đó bạn không nên là mỗi byte. Những thứ như trình tạo tốc độ bit và cấu hình ngoại vi chung chỉ nên được đặt một lần.

Thêm:

Bây giờ bạn nói rằng bạn không thể làm cho MSSP1 hoạt động nhưng đã khiến MSSP2 hoạt động. Điều đó gợi ý rằng bạn có một lỗi ở nơi khác trong mã đang thực hiện viết ngoài ý muốn. Nó xảy ra khi đánh một số trạng thái MSSP1, đó là lý do tại sao nó hoạt động kỳ lạ và tại sao MSSP2 hoạt động.

Đừng để điều này đi. Việc chuyển sang MSSP2 có thể đã khắc phục được sự cố, nhưng tốt nhất là bạn đã làm việc xung quanh nó, có thể là tạm thời. Lần tới khi bạn liên kết với những thứ ở những nơi khác nhau, bộ nhớ khác nhau có thể được viết nguệch ngoạc. Nếu bạn không tìm thấy và thực sự sửa lỗi này, phần sụn này sẽ không ổn định. Trường hợp xấu nhất là khi không có triệu chứng rõ ràng làm cho bạn có lợi để làm cho nó rõ ràng có một vấn đề. Vấn đề sau đó sẽ xuất hiện một năm sau đó khi chỉ cần gặp đúng dữ liệu, chỉ có một trang web của khách hàng, sau 1000 là trong lĩnh vực này. CỐ ĐỊNH NÀY QUYỀN NGAY BÂY GIỜ.


2

Có vẻ như bạn có thể gặp sự cố về tính toàn vẹn tín hiệu - trên ảnh chụp LA, nó xuất hiện dòng đồng hồ bị trục trặc khi dòng dữ liệu rơi xuống. Hãy chắc chắn rằng hai cái này được cách ly tốt, và dấu vết hoặc hệ thống dây điện không quá dài. Bạn cũng thử làm chậm tốc độ xung nhịp hoặc thêm bộ lọc RC nhỏ trên các dòng (nếu các dòng dài, chỉ cần một điện trở nối tiếp 220 có thể giúp)

Nếu bạn có máy hiện sóng, hãy kiểm tra các đường này để đảm bảo tính toàn vẹn tín hiệu là tốt. Nếu không, hãy thử các đề xuất ở trên và điều chỉnh mọi thứ cho đến khi bạn có tín hiệu chất lượng tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.