You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
3.0 KiB
118 lines
3.0 KiB
/** @file ir_serial.h
|
|
@author M. P. Hayes, UCECE
|
|
@date 23 August 2010
|
|
@brief Infrared serial driver.
|
|
|
|
@defgroup IR_serial Infrared serial driver
|
|
|
|
This module implements a simple serial protocol over an IR link.
|
|
It uses a pulse width modulation technique similar to the Sony
|
|
SIRC protocol. A message consists of a start code, 8 data bits
|
|
(transmitted LSB first), and a stop code. Each code is comprised
|
|
of 0.6 ms intervals called a dit:
|
|
|
|
Start bit: four dits on, one dit off
|
|
|
|
One bit: two dits on, one dit off
|
|
|
|
Zero bit: one dit on, one dit off
|
|
|
|
Stop bit: one dit off
|
|
|
|
Note, the duration of a message depends on the number of non-zero
|
|
bits in the data byte. The shortest message duration is 22 dits
|
|
(13.2 ms) and the longest message is 30 dits (18 ms). No error
|
|
detection or correction is performed apart from checking of
|
|
invalid codes.
|
|
|
|
Here's a simple application that transmits a data byte of value 7.
|
|
|
|
@code
|
|
#include "ir_serial.h"
|
|
|
|
void main (void)
|
|
{
|
|
system_init ();
|
|
ir_serial_init ();
|
|
|
|
ir_serial_transmit (7);
|
|
|
|
while (1)
|
|
{
|
|
}
|
|
}
|
|
@endcode
|
|
|
|
Here's another simple application that receives a data byte.
|
|
|
|
@code
|
|
#include "ir_serial.h"
|
|
#include "pacer.h"
|
|
|
|
void main (void)
|
|
{
|
|
system_init ();
|
|
ir_serial_init ();
|
|
|
|
pacer_init (1000);
|
|
|
|
while (1)
|
|
{
|
|
ir_serial_ret_t ret;
|
|
|
|
pacer_wait ();
|
|
|
|
ret = ir_serial_receive (&data);
|
|
if (ret == IR_SERIAL_OK)
|
|
{
|
|
// Process the received byte.
|
|
}
|
|
}
|
|
}
|
|
@endcode
|
|
*/
|
|
|
|
#ifndef IR_SERIAL_H
|
|
#define IR_SERIAL_H
|
|
|
|
#include "ir.h"
|
|
|
|
/** Status return codes. */
|
|
typedef enum ir_serial_ret
|
|
{
|
|
/** A valid frame has been received. */
|
|
IR_SERIAL_OK = 1,
|
|
/** No data to read. */
|
|
IR_SERIAL_NONE = 0,
|
|
/** Invalid start code detected. */
|
|
IR_SERIAL_START_ERR = -1,
|
|
/** Invalid data code detected. */
|
|
IR_SERIAL_DATA_ERR = -2,
|
|
/** Invalid break code detected. */
|
|
IR_SERIAL_BREAK_ERR = -3,
|
|
/** Invalid stop code detected. */
|
|
IR_SERIAL_STOP_ERR = -4
|
|
} ir_serial_ret_t;
|
|
|
|
|
|
/** Transmit 8 bits of data over IR serial link.
|
|
@param data byte to transmit
|
|
@note No error checking is performed. This function blocks until
|
|
the frame is transmitted. */
|
|
void ir_serial_transmit (uint8_t data);
|
|
|
|
|
|
/** Receive 8 bits of data over IR serial link.
|
|
@param pdata pointer to byte to store received data
|
|
@return status code
|
|
@note No error checking is performed. If there is no activity on the
|
|
IR serial link, this function returns immediately. Otherwise, this
|
|
function blocks until the entire frame is received. */
|
|
ir_serial_ret_t ir_serial_receive (uint8_t *pdata);
|
|
|
|
|
|
/** Initialise IR serial driver. */
|
|
void ir_serial_init (void);
|
|
|
|
#endif
|