mirror of
https://github.com/esp8266/Arduino.git
synced 2025-07-30 16:24:09 +03:00
Initial Arduino IDE based on Processing.
This commit is contained in:
175
build/shared/lib/avrlib/megaio/megaio.c
Executable file
175
build/shared/lib/avrlib/megaio/megaio.c
Executable file
@ -0,0 +1,175 @@
|
||||
/*! \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);
|
||||
}
|
Reference in New Issue
Block a user