169 lines
4.2 KiB
C
169 lines
4.2 KiB
C
#include "HardWire.h"
|
|
#define WIRE_WRITE HWIRE.write
|
|
|
|
HardWire HWIRE(2,I2C_FAST_MODE); // stupid compiler
|
|
|
|
void OLED::_convert_float(char *buf, double num, int width, byte prec)
|
|
{
|
|
char format[10];
|
|
|
|
sprintf(format, "%%%i.%if", width, prec);
|
|
sprintf(buf, format, num);
|
|
}
|
|
|
|
|
|
void OLED::_initTWI()
|
|
{
|
|
if ((_sda_pin == SDA) and (_scl_pin == SCL))
|
|
{
|
|
|
|
// HardWire HWIRE(1,I2C_FAST_MODE); // I2c1
|
|
|
|
HWIRE.begin();
|
|
/*
|
|
twi = TWI1;
|
|
|
|
pmc_enable_periph_clk(WIRE_INTERFACE_ID);
|
|
PIO_Configure(g_APinDescription[PIN_WIRE_SDA].pPort, g_APinDescription[PIN_WIRE_SDA].ulPinType, g_APinDescription[PIN_WIRE_SDA].ulPin, g_APinDescription[PIN_WIRE_SDA].ulPinConfiguration);
|
|
PIO_Configure(g_APinDescription[PIN_WIRE_SCL].pPort, g_APinDescription[PIN_WIRE_SCL].ulPinType, g_APinDescription[PIN_WIRE_SCL].ulPin, g_APinDescription[PIN_WIRE_SCL].ulPinConfiguration);
|
|
NVIC_DisableIRQ(TWI1_IRQn);
|
|
NVIC_ClearPendingIRQ(TWI1_IRQn);
|
|
NVIC_SetPriority(TWI1_IRQn, 0);
|
|
NVIC_EnableIRQ(TWI1_IRQn);
|
|
*/
|
|
|
|
}
|
|
else if ((_sda_pin == SDA1) and (_scl_pin == SCL1))
|
|
{
|
|
HWIRE.begin();
|
|
// I2c2
|
|
// HardWire HWIRE(2,I2C_FAST_MODE);
|
|
// HWIRE.begin();
|
|
|
|
/*
|
|
twi = TWI0;
|
|
|
|
pmc_enable_periph_clk(WIRE1_INTERFACE_ID);
|
|
PIO_Configure(g_APinDescription[PIN_WIRE1_SDA].pPort, g_APinDescription[PIN_WIRE1_SDA].ulPinType, g_APinDescription[PIN_WIRE1_SDA].ulPin, g_APinDescription[PIN_WIRE1_SDA].ulPinConfiguration);
|
|
PIO_Configure(g_APinDescription[PIN_WIRE1_SCL].pPort, g_APinDescription[PIN_WIRE1_SCL].ulPinType, g_APinDescription[PIN_WIRE1_SCL].ulPin, g_APinDescription[PIN_WIRE1_SCL].ulPinConfiguration);
|
|
NVIC_DisableIRQ(TWI0_IRQn);
|
|
NVIC_ClearPendingIRQ(TWI0_IRQn);
|
|
NVIC_SetPriority(TWI0_IRQn, 0);
|
|
NVIC_EnableIRQ(TWI0_IRQn);
|
|
*/
|
|
}
|
|
|
|
// activate internal pullups for twi.
|
|
// digitalWrite(SDA, 1);
|
|
//digitalWrite(SCL, 1);
|
|
/*
|
|
// Reset the TWI
|
|
twi->TWI_CR = TWI_CR_SWRST;
|
|
// TWI Slave Mode Disabled, TWI Master Mode Disabled.
|
|
twi->TWI_CR = TWI_CR_SVDIS;
|
|
twi->TWI_CR = TWI_CR_MSDIS;
|
|
// Set TWI Speed
|
|
twi->TWI_CWGR = (TWI_DIV << 16) | (TWI_SPEED << 8) | TWI_SPEED;
|
|
// Set master mode
|
|
twi->TWI_CR = TWI_CR_MSEN;
|
|
*/
|
|
}
|
|
|
|
void OLED::update()
|
|
{
|
|
//noInterrupts();
|
|
_sendTWIcommand(SSD1306_SET_COLUMN_ADDR);
|
|
_sendTWIcommand(0);
|
|
_sendTWIcommand(127);
|
|
|
|
_sendTWIcommand(SSD1306_SET_PAGE_ADDR);
|
|
_sendTWIcommand(0);
|
|
_sendTWIcommand(7);
|
|
|
|
if (_use_hw) // Send TWI Start
|
|
{
|
|
HWIRE.beginTransmission(SSD1306_ADDR);
|
|
WIRE_WRITE(SSD1306_DATA_CONTINUE);
|
|
/*
|
|
// Set slave address and number of internal address bytes.
|
|
twi->TWI_MMR = (1 << 8) | (SSD1306_ADDR << 16);
|
|
// Set internal address bytes
|
|
twi->TWI_IADR = SSD1306_DATA_CONTINUE;
|
|
// Send start address
|
|
*/
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
_sendStart(SSD1306_ADDR<<1);
|
|
_waitForAck();
|
|
_writeByte(SSD1306_DATA_CONTINUE);
|
|
_waitForAck();
|
|
}
|
|
|
|
for (int b=0; b<1024; b++) // Send data
|
|
if (_use_hw)
|
|
{
|
|
/*
|
|
twi->TWI_THR = scrbuf[b];
|
|
while ((twi->TWI_SR & TWI_SR_TXRDY) != TWI_SR_TXRDY) {};
|
|
*/
|
|
static byte aa=scrbuf[b];
|
|
WIRE_WRITE(aa);
|
|
|
|
}
|
|
else
|
|
{
|
|
_writeByte(scrbuf[b]);
|
|
_waitForAck();
|
|
}
|
|
|
|
if (_use_hw) // Send TWI Stop
|
|
{
|
|
HWIRE.endTransmission();
|
|
/*
|
|
// Send STOP condition
|
|
twi->TWI_CR = TWI_CR_STOP;
|
|
while ((twi->TWI_SR & TWI_SR_TXCOMP) != TWI_SR_TXCOMP) {};
|
|
*/
|
|
}
|
|
else
|
|
_sendStop();
|
|
//interrupts();
|
|
}
|
|
|
|
void OLED::_sendTWIcommand(uint8_t value)
|
|
{
|
|
if (_use_hw)
|
|
{
|
|
HWIRE.beginTransmission(SSD1306_ADDR);
|
|
WIRE_WRITE(SSD1306_COMMAND);
|
|
WIRE_WRITE(value);
|
|
HWIRE.endTransmission();
|
|
/*
|
|
// Set slave address and number of internal address bytes.
|
|
twi->TWI_MMR = (1 << 8) | (SSD1306_ADDR << 16);
|
|
// Set internal address bytes
|
|
twi->TWI_IADR = SSD1306_COMMAND;
|
|
|
|
twi->TWI_THR = value;
|
|
while ((twi->TWI_SR & TWI_SR_TXRDY) != TWI_SR_TXRDY) {};
|
|
|
|
// Send STOP condition
|
|
twi->TWI_CR = TWI_CR_STOP;
|
|
while ((twi->TWI_SR & TWI_SR_TXCOMP) != TWI_SR_TXCOMP) {};
|
|
*/
|
|
}
|
|
else
|
|
{
|
|
_sendStart(SSD1306_ADDR<<1);
|
|
_waitForAck();
|
|
_writeByte(SSD1306_COMMAND);
|
|
_waitForAck();
|
|
_writeByte(value);
|
|
_waitForAck();
|
|
_sendStop();
|
|
}
|
|
}
|