mirror of
https://github.com/arduino/Arduino.git
synced 2024-11-30 11:24:12 +01:00
176 lines
4.7 KiB
C
Executable File
176 lines
4.7 KiB
C
Executable File
/*! \file megaio.c \brief MegaIO Control/Access function library. */
|
|
//*****************************************************************************
|
|
//
|
|
// File Name : 'megaio.c'
|
|
// Title : MegaIO Control/Access function library
|
|
// Author : Pascal Stang - Copyright (C) 2004
|
|
// Created : 5/18/2004
|
|
// Revised : 5/18/2004
|
|
// Version : 0.1
|
|
// Target MCU : Atmel AVR series
|
|
// Editor Tabs : 4
|
|
//
|
|
// This code is distributed under the GNU Public License
|
|
// which can be found at http://www.gnu.org/licenses/gpl.txt
|
|
//
|
|
//*****************************************************************************
|
|
|
|
#include "buffer.h" // include buffer support
|
|
#include "i2c.h" // include I2C functions
|
|
#include "megaio/megaioreg.h" // include MegaIO register definitions
|
|
|
|
#include "megaio.h"
|
|
|
|
// MegaIO local receive buffer size
|
|
#define MEGAIO_UART_RX_BUFFER_SIZE 0x80
|
|
// MegaIO local receive buffer data array
|
|
static char megaioUartRxData[MEGAIO_UART_RX_BUFFER_SIZE];
|
|
// MegaIO local receive buffer
|
|
cBuffer megaioUartRxBuffer;
|
|
|
|
//! initialize the MegaIO interface
|
|
u08 megaioInit(void)
|
|
{
|
|
// initialize the UART receive buffer
|
|
bufferInit(&megaioUartRxBuffer, megaioUartRxData, MEGAIO_UART_RX_BUFFER_SIZE);
|
|
// initialize i2c interface
|
|
i2cInit();
|
|
i2cSetBitrate(30);
|
|
// check for presence of megaio chip
|
|
if( megaioReadReg(MEGAIOREG_IDSTRING, 1) == 'M' )
|
|
{
|
|
// megaio responded correctly
|
|
// initialization succeeded
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
// megaio responded incorrectly
|
|
// initialization failed
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
//! write an 8-32 bit number to a MegaIO register
|
|
void megaioWriteReg(unsigned char regnum, unsigned char nbytes, unsigned long data)
|
|
{
|
|
u08 packet[5];
|
|
|
|
// construct I2c data packet
|
|
// first byte is register address
|
|
// following bytes are the data that will be written to that register
|
|
packet[0] = regnum;
|
|
packet[1] = data;
|
|
packet[2] = data>>8;
|
|
packet[3] = data>>16;
|
|
packet[4] = data>>24;
|
|
// send 2 bytes (register and data) to MegaIO
|
|
i2cMasterSend(MEGAIO_I2C_ADDR, 1+nbytes, packet);
|
|
}
|
|
|
|
//! read an 8-32 bit number from a MegaIO register
|
|
unsigned long megaioReadReg(unsigned char regnum, unsigned char nbytes)
|
|
{
|
|
unsigned long data = 0;
|
|
|
|
// first select the register by writing 1 byte (register)
|
|
i2cMasterSend(MEGAIO_I2C_ADDR, 1, ®num);
|
|
// then read n byte(s) from the selected MegaIO register
|
|
i2cMasterReceive(MEGAIO_I2C_ADDR, nbytes, (u08*)&data);
|
|
// return the results
|
|
return data;
|
|
}
|
|
|
|
//! set the baudrate of the megaio serial port
|
|
void megaioSetBaudRate(u32 baudrate)
|
|
{
|
|
megaioWriteReg(MEGAIOREG_UARTBAUD, 4, baudrate);
|
|
}
|
|
|
|
//! send a byte out the megaio serial port
|
|
void megaioSendByte(u08 data)
|
|
{
|
|
megaioWriteReg(MEGAIOREG_UARTDATA, 1, data);
|
|
}
|
|
|
|
//! get a byte from the megaio serial port
|
|
int megaioGetByte(void)
|
|
{
|
|
u08 data;
|
|
|
|
// check the number of bytes in the megaio receive buffer
|
|
if( megaioReadReg(MEGAIOREG_UARTRXBUFBYTES, 1) )
|
|
{
|
|
// one or more bytes are available
|
|
// get first byte
|
|
data = megaioReadReg(MEGAIOREG_UARTDATA, 1);
|
|
return data;
|
|
}
|
|
else
|
|
{
|
|
// no bytes were available
|
|
// (no bytes have arrived and are waiting to be read)
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
//! returns the receive buffer structure
|
|
cBuffer* megaioGetRxBuffer(void)
|
|
{
|
|
u08 nbytes;
|
|
// get the number of bytes waiting in the MegaIO buffer
|
|
nbytes = megaioReadReg(MEGAIOREG_UARTRXBUFBYTES, 1);
|
|
// get all available bytes from the MegaIO chip
|
|
// and add them to the receive buffer
|
|
while(megaioReadReg(MEGAIOREG_UARTRXBUFBYTES, 1))
|
|
{
|
|
bufferAddToEnd(&megaioUartRxBuffer, megaioReadReg(MEGAIOREG_UARTDATA, 1));
|
|
nbytes--;
|
|
}
|
|
// return rx buffer pointer
|
|
return &megaioUartRxBuffer;
|
|
}
|
|
|
|
//! turn on megaio PWM and set for bitRes resolution
|
|
void megaioPWMInit(u08 bitRes)
|
|
{
|
|
megaioWriteReg(MEGAIOREG_PWM1CTRL, 1, bitRes);
|
|
}
|
|
|
|
//! turn off megaio PWM
|
|
void megaioPWMOff(void)
|
|
{
|
|
megaioWriteReg(MEGAIOREG_PWM1CTRL, 1, 0);
|
|
}
|
|
|
|
//! set megaio PWM1A duty cycle
|
|
void megaioPWMASet(u16 pwmDuty)
|
|
{
|
|
megaioWriteReg(MEGAIOREG_PWM1ADUTY, 2, pwmDuty);
|
|
}
|
|
|
|
//! set megaio PWM1B duty cycle
|
|
void megaioPWMBSet(u16 pwmDuty)
|
|
{
|
|
megaioWriteReg(MEGAIOREG_PWM1BDUTY, 2, pwmDuty);
|
|
}
|
|
|
|
//! set megaio prescaler division rate
|
|
void megaioSetPrescaler(u08 prescaleDiv)
|
|
{
|
|
megaioWriteReg(MEGAIOREG_PWM1FREQ, 1, prescaleDiv);
|
|
}
|
|
|
|
//! do A/D conversion on channel [ch] and return result
|
|
u16 megaioA2DConvert(u08 ch)
|
|
{
|
|
// set channel
|
|
megaioWriteReg(MEGAIOREG_ADCCHSEL, 1, ch);
|
|
// start single conversion
|
|
megaioWriteReg(MEGAIOREG_ADCCTRL, 1, 0x01);
|
|
// wait for conversion to be complete
|
|
while( megaioReadReg(MEGAIOREG_ADCCTRL, 1) );
|
|
// get result and return it
|
|
return megaioReadReg(MEGAIOREG_ADCRESULT, 2);
|
|
}
|