In this implementation the receive pin is P2.5
Required definitions, etc:
#include "msp430x24x.h"
#define BIT_BANG_RX_PORT P2IN
#define BIT_BANG_RX_BIT BIT5
#define DISABLE_BIT_BANG_RX_INTERRUPT() (P2IE &= ~BIT5)
#define ENABLE_BIT_BANG_RX_INTERRUPT() (P2IE |= BIT5)
//Timings calculated using DCO_8_MHZ - modify if different oscillator speed or different hardware
#define BIT_LENGTH_9600 160
#define HALF_BIT_LENGTH_9600 76
#define BIT_LENGTH_19200 75
#define HALF_BIT_LENGTH_19200 27
/** Simple delay for bit width. Used in transmit and receive. */
void delayFullBit() {for (unsigned int i = 0; i < BIT_LENGTH_19200; i++) ; } //104uSec delay
/** Simple delay for 1/2 of bit width. Used in receive. */
void delayHalfBit() {for (unsigned int i = 0; i < HALF_BIT_LENGTH_19200; i++) ; } //104uSec delay
#define NUMBER_OF_DATA_BITS 8
#define TOGGLE_DEBUG_PIN() (P4OUT ^= BIT5) //debugging only
Output function:
/**
* Blocking UART receiver. Called by BIT_BANG_RX_PORT Interrupt Service Routine upon detection of start bit (high to low transition).
* BIT_BANG_RX_BIT should be configured as high-low edge triggered interrupt.
* Receives a byte and then processes it.
* @note BIT_BANG_RX_PORT, BIT_BANG_RX_BIT, DISABLE_BIT_BANG_RX_INTERRUPT(), and ENABLE_BIT_BANG_RX_INTERRUPT() must be #defined. Modify accordingly for other hardware.
* @pre Oscillator configured for 8MHz
* @pre A high-to-low transition has occurred on BIT_BANG_RX_BIT
* @return the byte received
*/
char bitBangInput()
{
unsigned char receivedBitIndex = 0;
unsigned char receivedByte = 0;
DISABLE_BIT_BANG_RX_INTERRUPT();
delayHalfBit(); //Since this method was called on detection of an edge, need to wait until we're in the middle of the bit width.
TOGGLE_DEBUG_PIN();
//Read this start bit - should be zero
if (BIT_BANG_RX_PORT & BIT_BANG_RX_BIT)
{
//error - re-enable interrupt and return
}
for (int i =0; i {
delayFullBit();
TOGGLE_DEBUG_PIN();
receivedByte |= (BIT_BANG_RX_PORT & BIT_BANG_RX_BIT) ? (1 << receivedBitIndex) : 0; //Sample the bit, and if '1' then increase receivedByte accordingly
receivedBitIndex++;
}
delayFullBit();
TOGGLE_DEBUG_PIN();
//THIS IS STOP BIT (line should be back high)
if (!(BIT_BANG_RX_PORT & BIT_BANG_RX_BIT))
{
//error - line is low; should be high because this is stop bit
}
//all bits have been received!
ENABLE_BIT_BANG_RX_INTERRUPT();
return receivedByte;
}
No comments:
Post a Comment