Estoy luchando para intentar poner en funcionamiento un puerto UART (sin control de flujo ni bit de paridad) en un PIC32MX para comunicarme con una huella digital por mucho tiempo, así que decidí volver con ustedes. Solo puedo poner el lector de huellas dactilares en E / S digitales porque no tengo más puertos UART disponibles. No hay ningún problema para el pin TX, pero cuando se trata de habilitar el pin RX (interrupción CN) estoy viendo un problema.
Este es el Lector de huellas dactilares Estoy usando un esto es el datasheet para el PIC.
Estoy utilizando el puerto CN4 / RB2 para la interrupción (Rx) y el RB0 para transmitir. El compilador es XC32.
#include "NVMem.h"
#define Baudrate 4800 //bps
#define OneBitDelay (1000000/Baudrate) // microseconds
#define DataBitCount 8 // no parity, no flow control
#define UART_RX TRISBbits.TRISB2 // UART RX pin
#define UART_TX LATBbits.LATB0 // UART TX pin
#define UART_RX_DIR TRISBbits.TRISB2 // UART RX pin direction
#define UART_TX_DIR TRISBbits.TRISB0 // UART TX pin direction
int volatile readB = 0;
unsigned char UART_Receive(void);
void UART_Transmit(const char);
void __ISR(_CHANGE_NOTICE_VECTOR, ipl5) ChangeNoticeHandler(void)
{
readB = PORTB; // Read PORTB to clear CN4 mismatch condition
if (readB){
UART_Transmit(UART_Receive());
}
LATDINV = 0x0F; // PORTG = 0xff; // Toggle outputs.
IFS1CLR = 0x0001; // Be sure to clear the CN interrupt status
}
unsigned char UART_Receive(void)
{
unsigned char DataValue = 0;
unsigned char i = 0;
while(UART_RX==1);
delay_us(OneBitDelay);
delay_us(OneBitDelay/2);
for ( i = 0; i < DataBitCount; i++ )
{
if ( UART_RX == 1 ) //if received bit is high
{
DataValue += (1<<i);
}
delay_us(OneBitDelay);
}
if ( UART_RX == 1 ) //Stop bit should be high
{
return DataValue;
}
else //some error occurred !
{
delay_us(OneBitDelay);
return 0x000;
}
}
void UART_Transmit(const char DataValue)
{
/* Basic Logic
TX pin is usually high. A high to low bit is the starting bit and
a low to high bit is the ending bit. No parity bit. No flow control.
BitCount is the number of bits to transmit. Data is transmitted LSB first.
*/
// Send Start Bit
UART_TX = 0;
delay_us(OneBitDelay);
unsigned char i;
for ( i = 0; i < DataBitCount; i++ )
{
//Set Data pin according to the DataValue
if( ((DataValue>>i)&0x1) == 0x1 ) //if Bit is high
{
UART_TX = 1;
}
else //if Bit is low
{
UART_TX = 0;
}
delay_us(OneBitDelay);
}
//Send Stop Bit
UART_TX = 1;
}
void FingerprintRun(Task * task){
CNCON = 0x8000; // Enable CN module
CNEN = 0x00000010; // Enable individual CN pin CN4
CNPUE = 0x00000010; // Enable weak pull up for pin CN4
UART_TX = 1; // TX pin is high in idle state
UART_RX_DIR = 1; // Input
UART_TX_DIR = 0; // Output
readB = PORTB;
IPC6SET = 0x00140000; // Set priority level=5
IPC6SET = 0x00030000; // Set Subpriority level=3
IEC1SET = 0x0001; // Enable Change Notice interrupts
UART_Transmit ('H');
UART_Transmit ('i');
UART_Transmit ('\r');
while(UART_RX==0){
asm("nop");
}
while(1)
{
}
}
Mientras se depura, el contador del programa nunca pasa a la interrupción.