У меня установлен 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");
}