PIC18F45K80 SPI связь с QT1481 - PullRequest
       20

PIC18F45K80 SPI связь с QT1481

0 голосов
/ 19 октября 2018

У меня установлен MPLAB X, и я пытаюсь запрограммировать код, который отправляет команду 0x0F из PIC18F45K80 (RX не подключен. Можно ли отправить команду в MOSI, а затем получить ответ в MISO) в QT1481 с использованием языка Си.Внутренние часы должны быть 1 МГц.Выход должен отправить 0x0F, а QT1481 должен отправить обратно 0xF0 обратно в PIC18F45K80.Я использую док-станцию ​​(программное обеспечение последовательного терминала), чтобы узнать, смогу ли я получить ответ.

Введение QT1481 использует режимы связи SPI или UART;он не может использовать оба одновременно.QT1481 отвечает на любой интерфейс, который получает команду.QT1481 также включает в себя выходной интерфейс отладки, который можно использовать для мониторинга многих рабочих переменных во время разработки продукта.Хост-устройство всегда инициирует коммуникационные последовательности;QT1481 неспособен болтать с данными обратно на хост.Это сделано специально для целей FMEA и IEC / EN60730, чтобы хост всегда имел полный контроль над связью с QT1481.

 В режиме SPI QT1481 является ведомым, поэтому даже возвращаемые данные после команды контролируются хостом.

 В режиме UART QT1481 по-прежнему реагирует на хост только послекоманда, но ответы не контролируются хостом.

Команда от хоста всегда заканчивается каким-либо ответом от QT1481.Некоторые типы передачи от хоста или QT1481 используют контрольный байт CRC для обеспечения надежной связи.DRDY линия, которая обеспечивает передачу рукопожатия.Это необходимо для хоста из QT1481, чтобы гарантировать, что передачи не отправляются, когда QT1481 занят или еще не обработал предыдущую команду.В режиме UART эта линия является двунаправленной, и QT1481 может использовать ее для приостановки передачи обратно на хост, если хост занят.Если хост не соблюдает правильную синхронизацию DRDY, это может привести к случайным ошибкам связи.Инициирование или сброс связи: после сброса или в случае потери связи из-за шума или непоследовательного приема хост должен многократно ожидать период времени не менее истечения времени ожидания связи QT1481 (110 мс ± 5 мс),и отправлять команду 0x0F (вернуть последнюю команду), пока не будет получено дополнение 0x0F, равное 0xF0.Затем хост может возобновить нормальный обмен данными в режиме работы с чистого запуска.

  /*
     * File:   main.c
     * Author: Mateusz
     *
     * Created on 18 October 2018, 11:59
    */


    #include <xc.h>
    #include <PIC18F45K80.h>
    #include "mcc_generated_files/mcc.h"
    #include <stdio.h>
    #include <stdlib.h>

    #define SPI_CLK TRISCbits.TRISC3
    #define SPI_SDI TRISCbits.TRISC4
    #define SPI_SDO TRISCbits.TRISC5
    #define SPI_SS  TRISDbits.TRISD4

    unsigned char SPI_Recv[256];

    //Declaration Methods for EUSART!

    void WriteChar (unsigned char _data);
    void WriteText (unsigned char *text); 
    void Delay ();
    void Configuration_EUSART();
    void GetChar (); 

    //****************** Declaration SPI MASTER COnfiguration 
    *******************************

    void SPI_Init();
    void SPI_Write(unsigned char data);
    void SPI_Read();

    void main(void)
    {
        Configuration_EUSART();
        SPI_Init();
        while (1)
        {   
            WriteText("0x0F");
            SPI_Read();
            for (int x=0; x<=500;x++)
            {
                __delay_ms(100);
            }
        } 
    }

    void WriteChar(unsigned char _data)//Writing a character
    {
        if (PIR1bits.TXIF == 1)// if TXIF = 1 The EUSART Transmit Buffer 
       TXREG is empty and its ready to send the next data
        {
            while(!TXSTAbits.TRMT);
            TXREG = _data;
        }
    }   

    void WriteText (unsigned char *text) //Writing Text
    {
        for(int i=0; text[i]!='\0'; i++)
        {
            WriteChar(text[i]);
        }
    }

    void Configuration_EUSART()
    {

        //--------------------------------------------PIC18F13K50 Configuration USART------------------------------------------------//

        // Configuration Signal Tx & Rx
        BAUDCON1bits.CKTXP = 0;// 0 = NO - invert the polarity data and prevent the incorrect function in the PIC using the UART in the Transmision Data TX  
        BAUDCON1bits.DTRXP = 0;// 0 = NO - invert the polarity data and prevent the incorrect function in the PIC using the UART in the Receive Data RX
        // Oscillator Configuration
        //OSCCONbits.IRCF = 0b110; // internal Oscillator Selection IRCF <2:0> 8 Mhz
        //OSCCONbits.SCS = 0b00; // 0b00 = Prevent the modification and select de Oscillator FOSC in configuration bits
        //Configuration PIN TX and RX
        //ANSELHbits.ANS11 = 0; //Digital input buffer  RB5 (Rx) is enabled
        //ANSELHbits.ANS10 = 0; //Digital Output buffer  RB4 (SDA) is enabled
        TRISCbits.TRISC4 = 1; // RB5 (Rx) Input Mode
        TRISCbits.TRISC5 = 1; // RB7 (Tx) Input Mode, SPEN will reconfigured the pin RB7 as Output when is required

        //-------Baud Rate --------
        // BAUDCONbits.BRG16 = 1; //Times of 16 bits
        // TXSTAbits.BRGH = 1; // if BRHG is clear is (low) and if is set is (High) 
        // SPBRG = 25; // This Decimal Number (25) represent the Baud rate 115200 at 12 Mhz (see the datasheet)

        //Serial Port Configuration
        TXSTAbits.SYNC = 0; // Async Mode
        TXSTAbits.TXEN = 1; // Enable Transmission
        RCSTAbits.CREN = 1; // Enable reception bit Rx
        RCSTAbits.SPEN = 1; // Enable Serial Port
   }

// -------------------------------------- SPI CONFIG --------------------------------------------//
void SPI_Init(){
    //set tris bits for serial port pins
    SPI_CLK = 0; //output
    SPI_SDI = 1; //input
    SPI_SDO = 0; //output
    SPI_SS = 0; //output

    PIR1bits.SSPIF = 0; // Clear interrupt flag
    PIE1bits.SSPIE = 0; // Disable MSSP interrupt
    INTCONbits.PEIE = 0; // Disable perriferal interrupts


    SSPSTATbits.SMP = 0; //input samled at middle of interval
    SSPSTATbits.CKE = 0; //Data transmitted from low to high clock

    //Enable SSP, Master mode, clock Fosc/4
    SSPCON1 |= 0b00100000;

}

void SPI_Write(unsigned char data){
    unsigned char TempVar;
    TempVar = SSPBUF; // Clears BF
    PIR1bits.SSPIF = 0; // Clear interrupt flag
    SSPBUF = data; // write byte to SSPBUF register
    while(!PIR1bits.SSPIF) {}; // wait until bus cycle complete
        //return ( 0 ); // if WCOL bit is not set return non-negative#
}

void SPI_Read()
{
     WriteText(" Here2");
     PIR1bits.SSPIF = 0; // Clear interrupt flag

     for (int i=0; i<=256;i++)
     {   
         WriteText(" Here3");
         SPI_Recv[i] = SSPBUF; // Save the data in SSPBUFF
         WriteText(" Here4");
         while(!PIR1bits.SSPIF) {}; // wait until bus cycle complete
         WriteText(" Here5");

     }


     WriteText(" Here6");
     WriteText(SPI_Recv);
     WriteText(" Here7");

}
...