Kod: Markera allt
master:
AT+UART=115200,0,0
AT+ROLE=1
AT+CMODE=0
AT+BIND=aaaa,bb,cccccc (slave-addr)
slave:
AT+UART=115200,0,0
AT+ROLE=0
AT+CMODE=0
AT+BIND=aaaa,bb,cccccc (master-addr)
Men sen blev det lite lurigare. Jag byggde två prototypkort på veroboard. I princip identiska byggen, med enda skillnaden att RB0 är jordad på slaven så att jag i firmwaren (samma till båda) kan känna av om det är master eller slave som koden ska köras för. Korten har en 20MHz-kristall och fungerar (testkört båda med blinkande LED). Jag sätter sen upp USART-modulen att köra i 115kbaud, men sen är det tvärstopp. Jag får inte kommunikationen att fungera.
Här är min testkod:
Kod: Markera allt
#include <xc.h>
bit is_master;
// CONFIG
#pragma config FOSC = HS
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = ON
#pragma config BOREN = OFF
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config CP = OFF
void init_uart() {
TXSTA = RCSTA = 0;
if (is_master) {
// Async RS232
SYNC = 0; // asynchronous
SPEN = 1; // enable serial port
TXIE = 0; // no USART-interrupts
TXEN = 1; // enable transmitter
BRGH = 1; // use high baud rate
SPBRG = 10; // 115200 baud @ 20 MHz (page 78)
} else {
SYNC = 0;
SPEN = 1;
RCIE = 0;
CREN = 1;
BRGH = 1;
SPBRG = 10;
}
}
void send_device_state(char data) {
while(!TXIF)
continue;
TXREG = data;
}
void init_MCU() {
// If RB0 is connected to ground, device is in slave-mode.
// Therefore, check this bit prior everything else.
TRISB = 0b00000001; // RB0 - input
is_master = RB0;
if (is_master) {
TRISA = -1; // All inputs
TRISB = -1; // All inputs
} else {
TRISA = 0b11100000; // RA0-4 outputs
TRISB = 0b00000000; // All outputs
PORTA = -1; // Raise all pins (= device idle)
}
OPTION_REG = 0; // Enable WPU on RB
// Interrupts
INTCON = 0;
}
void main() {
init_MCU();
init_uart();
while (1) {
send_device_state('T');
send_device_state('e');
send_device_state('s');
send_device_state('t');
}
}
När det kört kanske en minut ploppar det upp ett "L" på skärmen, men inget mer.
Med hjälp av lite LED-debugging fann jag att koden stannar i while-loopen inne i send_device_state(). Har försökt hitta tips i databladet, men jag hittar ingen lösning. Nu efter 4-5 timmar har jag inte längre något mer att testa med, och har heller inga fler idéer.
Det enda jag inte har testat är att sätta en spänningsdelare på RX. Detta för att enligt databladet till min modul ska RX/TX vara 5V-säkra trots att det står 3.3V på dem.
Så; kan detta problem härröra sig ur att det är 5V, eller har jag missat något i koden? Eller något annat?