Merge pull request #856 from Ralim/pinecil/reworki2c
Pinecil | Rework I2C into much cleaner state machine
This commit is contained in:
@@ -88,19 +88,21 @@ uint16_t getInputVoltageX10(uint16_t divisor, uint8_t sample) {
|
|||||||
void unstick_I2C() {
|
void unstick_I2C() {
|
||||||
/* configure SDA/SCL for GPIO */
|
/* configure SDA/SCL for GPIO */
|
||||||
GPIO_BC(GPIOB) |= SDA_Pin | SCL_Pin;
|
GPIO_BC(GPIOB) |= SDA_Pin | SCL_Pin;
|
||||||
gpio_init(SDA_GPIO_Port, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, SDA_Pin | SCL_Pin);
|
gpio_init(SDA_GPIO_Port, GPIO_MODE_OUT_OD, GPIO_OSPEED_50MHZ, SDA_Pin | SCL_Pin);
|
||||||
asm("nop");
|
for (int i = 0; i < 8; i++) {
|
||||||
asm("nop");
|
asm("nop");
|
||||||
asm("nop");
|
asm("nop");
|
||||||
asm("nop");
|
asm("nop");
|
||||||
asm("nop");
|
asm("nop");
|
||||||
GPIO_BOP(GPIOB) |= SCL_Pin;
|
asm("nop");
|
||||||
asm("nop");
|
GPIO_BOP(GPIOB) |= SCL_Pin;
|
||||||
asm("nop");
|
asm("nop");
|
||||||
asm("nop");
|
asm("nop");
|
||||||
asm("nop");
|
asm("nop");
|
||||||
asm("nop");
|
asm("nop");
|
||||||
GPIO_BOP(GPIOB) |= SDA_Pin;
|
asm("nop");
|
||||||
|
GPIO_BOP(GPIOB) &= SCL_Pin;
|
||||||
|
}
|
||||||
/* connect PB6 to I2C0_SCL */
|
/* connect PB6 to I2C0_SCL */
|
||||||
/* connect PB7 to I2C0_SDA */
|
/* connect PB7 to I2C0_SDA */
|
||||||
gpio_init(SDA_GPIO_Port, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, SDA_Pin | SCL_Pin);
|
gpio_init(SDA_GPIO_Port, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, SDA_Pin | SCL_Pin);
|
||||||
|
|||||||
@@ -9,39 +9,39 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#include "gd32vf103_usart.h"
|
#include "gd32vf103_usart.h"
|
||||||
}
|
}
|
||||||
char uartOutputBuffer[uartOutputBufferLength];
|
char uartOutputBuffer[uartOutputBufferLength];
|
||||||
volatile uint32_t currentOutputPos = 0xFF;
|
volatile uint32_t currentOutputPos = 0xFF;
|
||||||
volatile uint32_t outputLength = 0;
|
volatile uint32_t outputLength = 0;
|
||||||
extern volatile uint8_t pendingPWM;
|
extern volatile uint8_t pendingPWM;
|
||||||
void log_system_state(int32_t PWMWattsx10) {
|
void log_system_state(int32_t PWMWattsx10) {
|
||||||
if (currentOutputPos == 0xFF) {
|
if (currentOutputPos == 0xFF) {
|
||||||
|
|
||||||
// Want to print a CSV log out the uart
|
// Want to print a CSV log out the uart
|
||||||
// Tip_Temp_C,Handle_Temp_C,Output_Power_Wattx10,PWM,Tip_Raw\r\n
|
// Tip_Temp_C,Handle_Temp_C,Output_Power_Wattx10,PWM,Tip_Raw\r\n
|
||||||
// 3+1+3+1+3+1+3+1+5+2 = 23, so sizing at 32 for now
|
// 3+1+3+1+3+1+3+1+5+2 = 23, so sizing at 32 for now
|
||||||
|
|
||||||
outputLength = snprintf(uartOutputBuffer, uartOutputBufferLength, "%lu,%u,%li,%u,%lu\r\n", //
|
outputLength = snprintf(uartOutputBuffer, uartOutputBufferLength, "%lu,%u,%li,%u,%lu\r\n", //
|
||||||
TipThermoModel::getTipInC(false), // Tip temp in C
|
TipThermoModel::getTipInC(false), // Tip temp in C
|
||||||
getHandleTemperature(), // Handle temp in C X10
|
getHandleTemperature(), // Handle temp in C X10
|
||||||
PWMWattsx10, // Output Wattage
|
PWMWattsx10, // Output Wattage
|
||||||
pendingPWM, // PWM
|
pendingPWM, // PWM
|
||||||
TipThermoModel::convertTipRawADCTouV(getTipRawTemp(0), true) // Tip temp in uV
|
TipThermoModel::convertTipRawADCTouV(getTipRawTemp(0), true) // Tip temp in uV
|
||||||
);
|
);
|
||||||
|
|
||||||
// Now print this out the uart via IRQ (DMA cant be used as oled has it)
|
// Now print this out the uart via IRQ (DMA cant be used as oled has it)
|
||||||
currentOutputPos = 0;
|
currentOutputPos = 0;
|
||||||
/* enable USART1 Transmit Buffer Empty interrupt */
|
/* enable USART1 Transmit Buffer Empty interrupt */
|
||||||
usart_interrupt_enable(UART_PERIF, USART_INT_TBE);
|
usart_interrupt_enable(UART_PERIF, USART_INT_TBE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void USART1_IRQHandler(void) {
|
void USART1_IRQHandler(void) {
|
||||||
if (RESET != usart_interrupt_flag_get(UART_PERIF, USART_INT_FLAG_TBE)) {
|
if (RESET != usart_interrupt_flag_get(UART_PERIF, USART_INT_FLAG_TBE)) {
|
||||||
/* write one byte to the transmit data register */
|
/* write one byte to the transmit data register */
|
||||||
usart_data_transmit(UART_PERIF, uartOutputBuffer[currentOutputPos++]);
|
usart_data_transmit(UART_PERIF, uartOutputBuffer[currentOutputPos++]);
|
||||||
if (currentOutputPos >= outputLength) {
|
if (currentOutputPos >= outputLength) {
|
||||||
currentOutputPos = 0xFF; // Mark done
|
currentOutputPos = 0xFF; // Mark done
|
||||||
usart_interrupt_disable(UART_PERIF, USART_INT_TBE);
|
usart_interrupt_disable(UART_PERIF, USART_INT_TBE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,353 +23,281 @@ uint8_t FRToSI2C::I2C_RegisterRead(uint8_t add, uint8_t reg) {
|
|||||||
return temp;
|
return temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FRToSI2C::Mem_Read(uint16_t DevAddress, uint16_t read_address, uint8_t *p_buffer, uint16_t number_of_byte) {
|
enum i2c_step {
|
||||||
if (!lock())
|
// Write+read steps
|
||||||
return false;
|
Write_start, // Sending start on bus
|
||||||
|
Write_device_address, // start sent, send device address
|
||||||
|
Write_device_memory_address, // device address sent, write the memory location
|
||||||
|
Write_device_data_start, // Write all of the remaining data using DMA
|
||||||
|
Write_device_data_finish, // Write all of the remaining data using DMA
|
||||||
|
|
||||||
|
Read_start, // second read
|
||||||
|
Read_device_address, // Send device address again for the read
|
||||||
|
Read_device_data_start, // read device data via DMA
|
||||||
|
Read_device_data_finish, // read device data via DMA
|
||||||
|
Send_stop, // send the stop at the end of the transaction
|
||||||
|
Wait_stop, // Wait for stop to send and we are done
|
||||||
|
Done, // Finished
|
||||||
|
Error_occured, // Error occured on the bus
|
||||||
|
|
||||||
|
};
|
||||||
|
struct i2c_state {
|
||||||
|
i2c_step currentStep;
|
||||||
|
bool isMemoryWrite;
|
||||||
|
bool wakePart;
|
||||||
|
uint8_t deviceAddress;
|
||||||
|
uint8_t memoryAddress;
|
||||||
|
uint8_t * buffer;
|
||||||
|
uint16_t numberOfBytes;
|
||||||
|
dma_parameter_struct dma_init_struct;
|
||||||
|
};
|
||||||
|
volatile i2c_state currentState;
|
||||||
|
|
||||||
|
void perform_i2c_step() {
|
||||||
|
// Performs next step of the i2c state machine
|
||||||
|
if (i2c_flag_get(I2C0, I2C_FLAG_AERR)) {
|
||||||
|
i2c_flag_clear(I2C0, I2C_FLAG_AERR);
|
||||||
|
// Arb error - we lost the bus / nacked
|
||||||
|
currentState.currentStep = Error_occured;
|
||||||
|
} else if (i2c_flag_get(I2C0, I2C_FLAG_BERR)) {
|
||||||
|
i2c_flag_clear(I2C0, I2C_FLAG_BERR);
|
||||||
|
// Bus Error
|
||||||
|
currentState.currentStep = Error_occured;
|
||||||
|
} else if (i2c_flag_get(I2C0, I2C_FLAG_LOSTARB)) {
|
||||||
|
i2c_flag_clear(I2C0, I2C_FLAG_LOSTARB);
|
||||||
|
// Bus Error
|
||||||
|
currentState.currentStep = Error_occured;
|
||||||
|
} else if (i2c_flag_get(I2C0, I2C_FLAG_PECERR)) {
|
||||||
|
i2c_flag_clear(I2C0, I2C_FLAG_PECERR);
|
||||||
|
// Bus Error
|
||||||
|
currentState.currentStep = Error_occured;
|
||||||
|
}
|
||||||
|
switch (currentState.currentStep) {
|
||||||
|
case Error_occured:
|
||||||
|
i2c_stop_on_bus(I2C0);
|
||||||
|
break;
|
||||||
|
case Write_start:
|
||||||
|
|
||||||
|
/* enable acknowledge */
|
||||||
|
i2c_ack_config(I2C0, I2C_ACK_ENABLE);
|
||||||
|
/* i2c master sends start signal only when the bus is idle */
|
||||||
|
if (!i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)) {
|
||||||
|
/* send the start signal */
|
||||||
|
i2c_start_on_bus(I2C0);
|
||||||
|
currentState.currentStep = Write_device_address;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Write_device_address:
|
||||||
|
/* i2c master sends START signal successfully */
|
||||||
|
if (i2c_flag_get(I2C0, I2C_FLAG_SBSEND)) {
|
||||||
|
i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
|
||||||
|
i2c_master_addressing(I2C0, currentState.deviceAddress, I2C_TRANSMITTER);
|
||||||
|
currentState.currentStep = Write_device_memory_address;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Write_device_memory_address:
|
||||||
|
// Send the device memory location
|
||||||
|
|
||||||
|
if (i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)) { // addr sent
|
||||||
|
i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
|
||||||
|
|
||||||
|
if (i2c_flag_get(I2C0, I2C_FLAG_BERR)) {
|
||||||
|
i2c_flag_clear(I2C0, I2C_FLAG_BERR);
|
||||||
|
// Bus Error
|
||||||
|
currentState.currentStep = Error_occured;
|
||||||
|
} else if (i2c_flag_get(I2C0, I2C_FLAG_AERR)) {
|
||||||
|
i2c_flag_clear(I2C0, I2C_FLAG_AERR);
|
||||||
|
// Arb error - we lost the bus / nacked
|
||||||
|
currentState.currentStep = Error_occured;
|
||||||
|
} else if (currentState.wakePart) {
|
||||||
|
// We are stopping here
|
||||||
|
currentState.currentStep = Send_stop;
|
||||||
|
} else if (i2c_flag_get(I2C0, I2C_FLAG_TBE)) {
|
||||||
|
// Write out the 8 byte address
|
||||||
|
i2c_data_transmit(I2C0, currentState.memoryAddress);
|
||||||
|
|
||||||
|
if (currentState.isMemoryWrite) {
|
||||||
|
currentState.currentStep = Write_device_data_start;
|
||||||
|
} else {
|
||||||
|
currentState.currentStep = Read_start;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case Write_device_data_start:
|
||||||
|
|
||||||
|
/* wait until BTC bit is set */
|
||||||
|
if (i2c_flag_get(I2C0, I2C_FLAG_BTC)) {
|
||||||
|
/* enable I2C0 DMA */
|
||||||
|
i2c_dma_enable(I2C0, I2C_DMA_ON);
|
||||||
|
/* enable DMA0 channel5 */
|
||||||
|
dma_channel_enable(DMA0, DMA_CH5);
|
||||||
|
currentState.currentStep = Write_device_data_finish;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Write_device_data_finish: // Wait for complete then goto stop
|
||||||
|
/* wait until BTC bit is set */
|
||||||
|
if (dma_flag_get(DMA0, DMA_CH5, DMA_FLAG_FTF)) {
|
||||||
|
/* wait until BTC bit is set */
|
||||||
|
if (i2c_flag_get(I2C0, I2C_FLAG_BTC)) {
|
||||||
|
currentState.currentStep = Send_stop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Read_start:
|
||||||
|
/* wait until BTC bit is set */
|
||||||
|
if (i2c_flag_get(I2C0, I2C_FLAG_BTC)) {
|
||||||
|
i2c_start_on_bus(I2C0);
|
||||||
|
currentState.currentStep = Read_device_address;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Read_device_address:
|
||||||
|
if (i2c_flag_get(I2C0, I2C_FLAG_SBSEND)) {
|
||||||
|
i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
|
||||||
|
i2c_master_addressing(I2C0, currentState.deviceAddress, I2C_RECEIVER);
|
||||||
|
currentState.currentStep = Read_device_data_start;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Read_device_data_start:
|
||||||
|
if (i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)) { // addr sent
|
||||||
|
i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
|
||||||
|
if (i2c_flag_get(I2C0, I2C_FLAG_AERR)) {
|
||||||
|
// Arb error - we lost the bus / nacked
|
||||||
|
currentState.currentStep = Error_occured;
|
||||||
|
}
|
||||||
|
/* one byte master reception procedure (polling) */
|
||||||
|
if (currentState.numberOfBytes == 0) {
|
||||||
|
currentState.currentStep = Send_stop;
|
||||||
|
} else if (currentState.numberOfBytes == 1) {
|
||||||
|
/* disable acknowledge */
|
||||||
|
i2c_ack_config(I2C0, I2C_ACK_DISABLE);
|
||||||
|
/* clear ADDSEND register by reading I2C_STAT0 then I2C_STAT1 register
|
||||||
|
* (I2C_STAT0 has already been read) */
|
||||||
|
i2c_flag_get(I2C0, I2C_FLAG_ADDSEND); // sat0
|
||||||
|
i2c_flag_get(I2C0, I2C_FLAG_I2CBSY); // sat1
|
||||||
|
/* send a stop condition to I2C bus*/
|
||||||
|
i2c_stop_on_bus(I2C0);
|
||||||
|
/* wait for the byte to be received */
|
||||||
|
while (!i2c_flag_get(I2C0, I2C_FLAG_RBNE))
|
||||||
|
;
|
||||||
|
/* read the byte received from the EEPROM */
|
||||||
|
*currentState.buffer = i2c_data_receive(I2C0);
|
||||||
|
currentState.currentStep = Wait_stop;
|
||||||
|
} else { /* more than one byte master reception procedure (DMA) */
|
||||||
|
/* enable I2C0 DMA */
|
||||||
|
i2c_dma_enable(I2C0, I2C_DMA_ON);
|
||||||
|
/* enable DMA0 channel5 */
|
||||||
|
dma_channel_enable(DMA0, DMA_CH6);
|
||||||
|
currentState.currentStep = Read_device_data_finish;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Read_device_data_finish: // Wait for complete then goto stop
|
||||||
|
/* wait until BTC bit is set */
|
||||||
|
if (dma_flag_get(DMA0, DMA_CH6, DMA_FLAG_FTF)) {
|
||||||
|
currentState.currentStep = Send_stop;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case Send_stop:
|
||||||
|
/* send a stop condition to I2C bus*/
|
||||||
|
i2c_stop_on_bus(I2C0);
|
||||||
|
currentState.currentStep = Wait_stop;
|
||||||
|
break;
|
||||||
|
case Wait_stop:
|
||||||
|
/* i2c master sends STOP signal successfully */
|
||||||
|
if ((I2C_CTL0(I2C0) & 0x0200) != 0x0200) {
|
||||||
|
currentState.currentStep = Done;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// If we get here something is amiss
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool perform_i2c_transaction(uint16_t DevAddress, uint16_t memory_address, uint8_t *p_buffer, uint16_t number_of_byte, bool isWrite, bool isWakeOnly) {
|
||||||
|
{
|
||||||
|
// TODO is this required
|
||||||
|
/* disable I2C0 */
|
||||||
|
i2c_disable(I2C0);
|
||||||
|
/* enable I2C0 */
|
||||||
|
i2c_enable(I2C0);
|
||||||
|
}
|
||||||
i2c_interrupt_disable(I2C0, I2C_INT_ERR);
|
i2c_interrupt_disable(I2C0, I2C_INT_ERR);
|
||||||
i2c_interrupt_disable(I2C0, I2C_INT_BUF);
|
i2c_interrupt_disable(I2C0, I2C_INT_BUF);
|
||||||
i2c_interrupt_disable(I2C0, I2C_INT_EV);
|
i2c_interrupt_disable(I2C0, I2C_INT_EV);
|
||||||
dma_parameter_struct dma_init_struct;
|
|
||||||
|
|
||||||
uint8_t state = I2C_START;
|
currentState.isMemoryWrite = isWrite;
|
||||||
uint8_t in_rx_cycle = 0;
|
currentState.wakePart = isWakeOnly;
|
||||||
uint16_t timeout = 0;
|
currentState.deviceAddress = DevAddress;
|
||||||
uint8_t tries = 0;
|
currentState.memoryAddress = memory_address;
|
||||||
uint8_t i2c_timeout_flag = 0;
|
currentState.numberOfBytes = number_of_byte;
|
||||||
while (!(i2c_timeout_flag)) {
|
currentState.buffer = p_buffer;
|
||||||
switch (state) {
|
if (!isWakeOnly) {
|
||||||
case I2C_START:
|
// Setup DMA
|
||||||
tries++;
|
currentState.dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
|
||||||
if (tries > 64) {
|
currentState.dma_init_struct.memory_addr = (uint32_t)p_buffer;
|
||||||
i2c_stop_on_bus(I2C0);
|
currentState.dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
|
||||||
/* i2c master sends STOP signal successfully */
|
currentState.dma_init_struct.number = number_of_byte;
|
||||||
while ((I2C_CTL0(I2C0) & 0x0200) && (timeout < I2C_TIME_OUT)) {
|
currentState.dma_init_struct.periph_addr = (uint32_t)&I2C_DATA(I2C0);
|
||||||
timeout++;
|
currentState.dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
|
||||||
}
|
currentState.dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
|
||||||
unlock();
|
currentState.dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
|
||||||
return false;
|
if (currentState.isMemoryWrite) {
|
||||||
}
|
dma_deinit(DMA0, DMA_CH5);
|
||||||
if (0 == in_rx_cycle) {
|
currentState.dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
|
||||||
/* disable I2C0 */
|
dma_init(DMA0, DMA_CH5, (dma_parameter_struct *)¤tState.dma_init_struct);
|
||||||
i2c_disable(I2C0);
|
} else {
|
||||||
/* enable I2C0 */
|
dma_deinit(DMA0, DMA_CH6);
|
||||||
i2c_enable(I2C0);
|
currentState.dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
|
||||||
|
dma_init(DMA0, DMA_CH6, (dma_parameter_struct *)¤tState.dma_init_struct);
|
||||||
|
}
|
||||||
|
|
||||||
/* enable acknowledge */
|
if (!currentState.isMemoryWrite) {
|
||||||
i2c_ack_config(I2C0, I2C_ACK_ENABLE);
|
i2c_dma_last_transfer_config(I2C0, I2C_DMALST_ON);
|
||||||
/* i2c master sends start signal only when the bus is idle */
|
|
||||||
while (i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) && (timeout < I2C_TIME_OUT)) {
|
|
||||||
timeout++;
|
|
||||||
}
|
|
||||||
if (timeout < I2C_TIME_OUT) {
|
|
||||||
/* send the start signal */
|
|
||||||
i2c_start_on_bus(I2C0);
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_SEND_ADDRESS;
|
|
||||||
} else {
|
|
||||||
I2C_Unstick();
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_START;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
i2c_start_on_bus(I2C0);
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_SEND_ADDRESS;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case I2C_SEND_ADDRESS:
|
|
||||||
/* i2c master sends START signal successfully */
|
|
||||||
while ((!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)) && (timeout < I2C_TIME_OUT)) {
|
|
||||||
timeout++;
|
|
||||||
}
|
|
||||||
if (timeout < I2C_TIME_OUT) {
|
|
||||||
if (RESET == in_rx_cycle) {
|
|
||||||
i2c_master_addressing(I2C0, DevAddress, I2C_TRANSMITTER);
|
|
||||||
state = I2C_CLEAR_ADDRESS_FLAG;
|
|
||||||
} else {
|
|
||||||
i2c_master_addressing(I2C0, DevAddress, I2C_RECEIVER);
|
|
||||||
state = I2C_CLEAR_ADDRESS_FLAG;
|
|
||||||
}
|
|
||||||
timeout = 0;
|
|
||||||
} else {
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_START;
|
|
||||||
in_rx_cycle = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case I2C_CLEAR_ADDRESS_FLAG:
|
|
||||||
/* address flag set means i2c slave sends ACK */
|
|
||||||
while ((!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)) && (timeout < I2C_TIME_OUT)) {
|
|
||||||
timeout++;
|
|
||||||
if (i2c_flag_get(I2C0, I2C_FLAG_AERR)) {
|
|
||||||
i2c_flag_clear(I2C0, I2C_FLAG_AERR);
|
|
||||||
i2c_stop_on_bus(I2C0);
|
|
||||||
/* i2c master sends STOP signal successfully */
|
|
||||||
while ((I2C_CTL0(I2C0) & 0x0200) && (timeout < I2C_TIME_OUT)) {
|
|
||||||
timeout++;
|
|
||||||
}
|
|
||||||
// Address NACK'd
|
|
||||||
unlock();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (timeout < I2C_TIME_OUT) {
|
|
||||||
i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_TRANSMIT_DATA;
|
|
||||||
} else {
|
|
||||||
i2c_stop_on_bus(I2C0);
|
|
||||||
/* i2c master sends STOP signal successfully */
|
|
||||||
while ((I2C_CTL0(I2C0) & 0x0200) && (timeout < I2C_TIME_OUT)) {
|
|
||||||
timeout++;
|
|
||||||
}
|
|
||||||
// Address NACK'd
|
|
||||||
unlock();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case I2C_TRANSMIT_DATA:
|
|
||||||
if (0 == in_rx_cycle) {
|
|
||||||
/* wait until the transmit data buffer is empty */
|
|
||||||
while ((!i2c_flag_get(I2C0, I2C_FLAG_TBE)) && (timeout < I2C_TIME_OUT)) {
|
|
||||||
timeout++;
|
|
||||||
}
|
|
||||||
if (timeout < I2C_TIME_OUT) {
|
|
||||||
// Write out the 8 byte address
|
|
||||||
i2c_data_transmit(I2C0, read_address);
|
|
||||||
timeout = 0;
|
|
||||||
} else {
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_START;
|
|
||||||
in_rx_cycle = 0;
|
|
||||||
}
|
|
||||||
/* wait until BTC bit is set */
|
|
||||||
while ((!i2c_flag_get(I2C0, I2C_FLAG_BTC)) && (timeout < I2C_TIME_OUT)) {
|
|
||||||
timeout++;
|
|
||||||
}
|
|
||||||
if (timeout < I2C_TIME_OUT) {
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_START;
|
|
||||||
in_rx_cycle = 1;
|
|
||||||
} else {
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_START;
|
|
||||||
in_rx_cycle = 0;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* one byte master reception procedure (polling) */
|
|
||||||
if (number_of_byte < 2) {
|
|
||||||
/* disable acknowledge */
|
|
||||||
i2c_ack_config(I2C0, I2C_ACK_DISABLE);
|
|
||||||
/* clear ADDSEND register by reading I2C_STAT0 then I2C_STAT1 register
|
|
||||||
* (I2C_STAT0 has already been read) */
|
|
||||||
i2c_flag_get(I2C0, I2C_FLAG_ADDSEND);
|
|
||||||
/* send a stop condition to I2C bus*/
|
|
||||||
i2c_stop_on_bus(I2C0);
|
|
||||||
/* wait for the byte to be received */
|
|
||||||
while (!i2c_flag_get(I2C0, I2C_FLAG_RBNE))
|
|
||||||
;
|
|
||||||
/* read the byte received from the EEPROM */
|
|
||||||
*p_buffer = i2c_data_receive(I2C0);
|
|
||||||
/* decrement the read bytes counter */
|
|
||||||
number_of_byte--;
|
|
||||||
timeout = 0;
|
|
||||||
} else { /* more than one byte master reception procedure (DMA) */
|
|
||||||
dma_deinit(DMA0, DMA_CH6);
|
|
||||||
dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
|
|
||||||
dma_init_struct.memory_addr = (uint32_t)p_buffer;
|
|
||||||
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
|
|
||||||
dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
|
|
||||||
dma_init_struct.number = number_of_byte;
|
|
||||||
dma_init_struct.periph_addr = (uint32_t)&I2C_DATA(I2C0);
|
|
||||||
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
|
|
||||||
dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
|
|
||||||
dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
|
|
||||||
dma_init(DMA0, DMA_CH6, &dma_init_struct);
|
|
||||||
|
|
||||||
i2c_dma_last_transfer_config(I2C0, I2C_DMALST_ON);
|
|
||||||
/* enable I2C0 DMA */
|
|
||||||
i2c_dma_enable(I2C0, I2C_DMA_ON);
|
|
||||||
/* enable DMA0 channel5 */
|
|
||||||
dma_channel_enable(DMA0, DMA_CH6);
|
|
||||||
/* wait until BTC bit is set */
|
|
||||||
while (!dma_flag_get(DMA0, DMA_CH6, DMA_FLAG_FTF)) {}
|
|
||||||
/* send a stop condition to I2C bus*/
|
|
||||||
i2c_stop_on_bus(I2C0);
|
|
||||||
}
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_STOP;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case I2C_STOP:
|
|
||||||
/* i2c master sends STOP signal successfully */
|
|
||||||
while ((I2C_CTL0(I2C0) & 0x0200) && (timeout < I2C_TIME_OUT)) {
|
|
||||||
timeout++;
|
|
||||||
}
|
|
||||||
if (timeout < I2C_TIME_OUT) {
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_END;
|
|
||||||
i2c_timeout_flag = I2C_OK;
|
|
||||||
} else {
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_START;
|
|
||||||
in_rx_cycle = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
state = I2C_START;
|
|
||||||
in_rx_cycle = 0;
|
|
||||||
i2c_timeout_flag = I2C_OK;
|
|
||||||
timeout = 0;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Clear flags
|
||||||
|
I2C_STAT0(I2C0) = 0;
|
||||||
|
I2C_STAT1(I2C0) = 0;
|
||||||
|
i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
|
||||||
|
|
||||||
|
currentState.currentStep = Write_start; // Always start in write mode
|
||||||
|
TickType_t timeout = xTaskGetTickCount() + TICKS_SECOND;
|
||||||
|
while ((currentState.currentStep != Done) && (currentState.currentStep != Error_occured)) {
|
||||||
|
if (xTaskGetTickCount() > timeout) {
|
||||||
|
i2c_stop_on_bus(I2C0);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
perform_i2c_step();
|
||||||
|
}
|
||||||
|
return currentState.currentStep == Done;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FRToSI2C::Mem_Read(uint16_t DevAddress, uint16_t read_address, uint8_t *p_buffer, uint16_t number_of_byte) {
|
||||||
|
if (!lock())
|
||||||
|
return false;
|
||||||
|
bool res = perform_i2c_transaction(DevAddress, read_address, p_buffer, number_of_byte, false, false);
|
||||||
|
if (!res) {
|
||||||
|
I2C_Unstick();
|
||||||
|
}
|
||||||
unlock();
|
unlock();
|
||||||
return true;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FRToSI2C::Mem_Write(uint16_t DevAddress, uint16_t MemAddress, uint8_t *p_buffer, uint16_t number_of_byte) {
|
bool FRToSI2C::Mem_Write(uint16_t DevAddress, uint16_t MemAddress, uint8_t *p_buffer, uint16_t number_of_byte) {
|
||||||
if (!lock())
|
if (!lock())
|
||||||
return false;
|
return false;
|
||||||
|
bool res = perform_i2c_transaction(DevAddress, MemAddress, p_buffer, number_of_byte, true, false);
|
||||||
i2c_interrupt_disable(I2C0, I2C_INT_ERR);
|
if (!res) {
|
||||||
i2c_interrupt_disable(I2C0, I2C_INT_EV);
|
I2C_Unstick();
|
||||||
i2c_interrupt_disable(I2C0, I2C_INT_BUF);
|
|
||||||
dma_parameter_struct dma_init_struct;
|
|
||||||
|
|
||||||
uint8_t state = I2C_START;
|
|
||||||
uint16_t timeout = 0;
|
|
||||||
bool done = false;
|
|
||||||
bool timedout = false;
|
|
||||||
while (!(done || timedout)) {
|
|
||||||
switch (state) {
|
|
||||||
case I2C_START:
|
|
||||||
/* i2c master sends start signal only when the bus is idle */
|
|
||||||
while (i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) && (timeout < I2C_TIME_OUT)) {
|
|
||||||
timeout++;
|
|
||||||
}
|
|
||||||
if (timeout < I2C_TIME_OUT) {
|
|
||||||
i2c_start_on_bus(I2C0);
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_SEND_ADDRESS;
|
|
||||||
} else {
|
|
||||||
I2C_Unstick();
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_START;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case I2C_SEND_ADDRESS:
|
|
||||||
/* i2c master sends START signal successfully */
|
|
||||||
while ((!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)) && (timeout < I2C_TIME_OUT)) {
|
|
||||||
timeout++;
|
|
||||||
}
|
|
||||||
if (timeout < I2C_TIME_OUT) {
|
|
||||||
i2c_master_addressing(I2C0, DevAddress, I2C_TRANSMITTER);
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_CLEAR_ADDRESS_FLAG;
|
|
||||||
} else {
|
|
||||||
timedout = true;
|
|
||||||
done = true;
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_START;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case I2C_CLEAR_ADDRESS_FLAG:
|
|
||||||
/* address flag set means i2c slave sends ACK */
|
|
||||||
while ((!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)) && (timeout < I2C_TIME_OUT)) {
|
|
||||||
timeout++;
|
|
||||||
if (i2c_flag_get(I2C0, I2C_FLAG_AERR)) {
|
|
||||||
i2c_flag_clear(I2C0, I2C_FLAG_AERR);
|
|
||||||
i2c_stop_on_bus(I2C0);
|
|
||||||
/* i2c master sends STOP signal successfully */
|
|
||||||
while ((I2C_CTL0(I2C0) & 0x0200) && (timeout < I2C_TIME_OUT)) {
|
|
||||||
timeout++;
|
|
||||||
}
|
|
||||||
// Address NACK'd
|
|
||||||
unlock();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
timeout = 0;
|
|
||||||
if (timeout < I2C_TIME_OUT) {
|
|
||||||
i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
|
|
||||||
state = I2C_TRANSMIT_DATA;
|
|
||||||
} else {
|
|
||||||
// Dont retry as this means a NAK
|
|
||||||
i2c_stop_on_bus(I2C0);
|
|
||||||
/* i2c master sends STOP signal successfully */
|
|
||||||
while ((I2C_CTL0(I2C0) & 0x0200) && (timeout < I2C_TIME_OUT)) {
|
|
||||||
timeout++;
|
|
||||||
}
|
|
||||||
unlock();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case I2C_TRANSMIT_DATA:
|
|
||||||
/* wait until the transmit data buffer is empty */
|
|
||||||
while ((!i2c_flag_get(I2C0, I2C_FLAG_TBE)) && (timeout < I2C_TIME_OUT)) {
|
|
||||||
timeout++;
|
|
||||||
}
|
|
||||||
if (timeout < I2C_TIME_OUT) {
|
|
||||||
/* send the EEPROM's internal address to write to : only one byte
|
|
||||||
* address */
|
|
||||||
i2c_data_transmit(I2C0, MemAddress);
|
|
||||||
timeout = 0;
|
|
||||||
} else {
|
|
||||||
timedout = true;
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_START;
|
|
||||||
}
|
|
||||||
/* wait until BTC bit is set */
|
|
||||||
while (!i2c_flag_get(I2C0, I2C_FLAG_BTC))
|
|
||||||
;
|
|
||||||
dma_deinit(DMA0, DMA_CH5);
|
|
||||||
dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
|
|
||||||
dma_init_struct.memory_addr = (uint32_t)p_buffer;
|
|
||||||
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
|
|
||||||
dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
|
|
||||||
dma_init_struct.number = number_of_byte;
|
|
||||||
dma_init_struct.periph_addr = (uint32_t)&I2C_DATA(I2C0);
|
|
||||||
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
|
|
||||||
dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
|
|
||||||
dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
|
|
||||||
dma_init(DMA0, DMA_CH5, &dma_init_struct);
|
|
||||||
/* enable I2C0 DMA */
|
|
||||||
i2c_dma_enable(I2C0, I2C_DMA_ON);
|
|
||||||
/* enable DMA0 channel5 */
|
|
||||||
dma_channel_enable(DMA0, DMA_CH5);
|
|
||||||
/* wait until BTC bit is set */
|
|
||||||
while (!dma_flag_get(DMA0, DMA_CH5, DMA_FLAG_FTF)) {}
|
|
||||||
/* wait until BTC bit is set */
|
|
||||||
while (!i2c_flag_get(I2C0, I2C_FLAG_BTC)) {}
|
|
||||||
state = I2C_STOP;
|
|
||||||
break;
|
|
||||||
case I2C_STOP:
|
|
||||||
/* send a stop condition to I2C bus */
|
|
||||||
i2c_stop_on_bus(I2C0);
|
|
||||||
/* i2c master sends STOP signal successfully */
|
|
||||||
while ((I2C_CTL0(I2C0) & 0x0200) && (timeout < I2C_TIME_OUT)) {
|
|
||||||
timeout++;
|
|
||||||
}
|
|
||||||
if (timeout < I2C_TIME_OUT) {
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_END;
|
|
||||||
done = true;
|
|
||||||
} else {
|
|
||||||
timedout = true;
|
|
||||||
done = true;
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_START;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
state = I2C_START;
|
|
||||||
timeout = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
unlock();
|
unlock();
|
||||||
return timedout == false;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FRToSI2C::Transmit(uint16_t DevAddress, uint8_t *pData, uint16_t Size) { return Mem_Write(DevAddress, pData[0], pData + 1, Size - 1); }
|
bool FRToSI2C::Transmit(uint16_t DevAddress, uint8_t *pData, uint16_t Size) { return Mem_Write(DevAddress, pData[0], pData + 1, Size - 1); }
|
||||||
@@ -406,104 +334,15 @@ bool FRToSI2C::wakePart(uint16_t DevAddress) {
|
|||||||
// wakepart is a special case where only the device address is sent
|
// wakepart is a special case where only the device address is sent
|
||||||
if (!lock())
|
if (!lock())
|
||||||
return false;
|
return false;
|
||||||
|
bool res = perform_i2c_transaction(DevAddress, 0, NULL, 0, false, true);
|
||||||
i2c_interrupt_disable(I2C0, I2C_INT_ERR);
|
if (!res) {
|
||||||
i2c_interrupt_disable(I2C0, I2C_INT_EV);
|
I2C_Unstick();
|
||||||
i2c_interrupt_disable(I2C0, I2C_INT_BUF);
|
|
||||||
|
|
||||||
uint8_t state = I2C_START;
|
|
||||||
uint16_t timeout = 0;
|
|
||||||
bool done = false;
|
|
||||||
bool timedout = false;
|
|
||||||
while (!(done || timedout)) {
|
|
||||||
switch (state) {
|
|
||||||
case I2C_START:
|
|
||||||
/* i2c master sends start signal only when the bus is idle */
|
|
||||||
while (i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) && (timeout < I2C_TIME_OUT)) {
|
|
||||||
timeout++;
|
|
||||||
}
|
|
||||||
if (timeout < I2C_TIME_OUT) {
|
|
||||||
i2c_start_on_bus(I2C0);
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_SEND_ADDRESS;
|
|
||||||
} else {
|
|
||||||
I2C_Unstick();
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_START;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case I2C_SEND_ADDRESS:
|
|
||||||
/* i2c master sends START signal successfully */
|
|
||||||
while ((!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)) && (timeout < I2C_TIME_OUT)) {
|
|
||||||
timeout++;
|
|
||||||
}
|
|
||||||
if (timeout < I2C_TIME_OUT) {
|
|
||||||
i2c_master_addressing(I2C0, DevAddress, I2C_TRANSMITTER);
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_CLEAR_ADDRESS_FLAG;
|
|
||||||
} else {
|
|
||||||
timedout = true;
|
|
||||||
done = true;
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_START;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case I2C_CLEAR_ADDRESS_FLAG:
|
|
||||||
/* address flag set means i2c slave sends ACK */
|
|
||||||
while ((!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)) && (timeout < I2C_TIME_OUT)) {
|
|
||||||
timeout++;
|
|
||||||
if (i2c_flag_get(I2C0, I2C_FLAG_AERR)) {
|
|
||||||
i2c_flag_clear(I2C0, I2C_FLAG_AERR);
|
|
||||||
i2c_stop_on_bus(I2C0);
|
|
||||||
/* i2c master sends STOP signal successfully */
|
|
||||||
while ((I2C_CTL0(I2C0) & 0x0200) && (timeout < I2C_TIME_OUT)) {
|
|
||||||
timeout++;
|
|
||||||
}
|
|
||||||
// Address NACK'd
|
|
||||||
unlock();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (timeout < I2C_TIME_OUT) {
|
|
||||||
i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_STOP;
|
|
||||||
} else {
|
|
||||||
// Dont retry as this means a NAK
|
|
||||||
i2c_stop_on_bus(I2C0);
|
|
||||||
/* i2c master sends STOP signal successfully */
|
|
||||||
while ((I2C_CTL0(I2C0) & 0x0200) && (timeout < I2C_TIME_OUT)) {
|
|
||||||
timeout++;
|
|
||||||
}
|
|
||||||
unlock();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case I2C_STOP:
|
|
||||||
/* send a stop condition to I2C bus */
|
|
||||||
i2c_stop_on_bus(I2C0);
|
|
||||||
/* i2c master sends STOP signal successfully */
|
|
||||||
while ((I2C_CTL0(I2C0) & 0x0200) && (timeout < I2C_TIME_OUT)) {
|
|
||||||
timeout++;
|
|
||||||
}
|
|
||||||
if (timeout < I2C_TIME_OUT) {
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_END;
|
|
||||||
done = true;
|
|
||||||
} else {
|
|
||||||
timedout = true;
|
|
||||||
done = true;
|
|
||||||
timeout = 0;
|
|
||||||
state = I2C_START;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
state = I2C_START;
|
|
||||||
timeout = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
unlock();
|
unlock();
|
||||||
return timedout == false;
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C_EV_IRQ() {}
|
||||||
|
void I2C_ER_IRQ() {
|
||||||
|
// Error callbacks
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -411,10 +411,9 @@ PolicyEngine::policy_engine_state PolicyEngine::pe_sink_ready() {
|
|||||||
|
|
||||||
return PESinkSendSoftReset;
|
return PESinkSendSoftReset;
|
||||||
}
|
}
|
||||||
/* If we got an unknown message, send a soft reset ??? */
|
|
||||||
} else {
|
} else {
|
||||||
|
/* if we get an unknown message code, silently ignore it*/
|
||||||
return PESinkSendSoftReset;
|
return PESinkReady;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ public:
|
|||||||
static uint32_t convertTipRawADCToDegC(uint16_t rawADC);
|
static uint32_t convertTipRawADCToDegC(uint16_t rawADC);
|
||||||
static uint32_t convertTipRawADCToDegF(uint16_t rawADC);
|
static uint32_t convertTipRawADCToDegF(uint16_t rawADC);
|
||||||
// Returns the uV of the tip reading before the op-amp compensating for pullups
|
// Returns the uV of the tip reading before the op-amp compensating for pullups
|
||||||
static uint32_t convertTipRawADCTouV(uint16_t rawADC,bool skipCalOffset=false);
|
static uint32_t convertTipRawADCTouV(uint16_t rawADC, bool skipCalOffset = false);
|
||||||
static uint32_t convertCtoF(uint32_t degC);
|
static uint32_t convertCtoF(uint32_t degC);
|
||||||
static uint32_t convertFtoC(uint32_t degF);
|
static uint32_t convertFtoC(uint32_t degF);
|
||||||
|
|
||||||
|
|||||||
@@ -32,11 +32,11 @@ typedef struct {
|
|||||||
// into soldering mode when power is applied
|
// into soldering mode when power is applied
|
||||||
uint8_t ShutdownTime; // Time until unit shuts down if left alone
|
uint8_t ShutdownTime; // Time until unit shuts down if left alone
|
||||||
|
|
||||||
uint8_t coolingTempBlink : 1; // Should the temperature blink on the cool
|
uint8_t coolingTempBlink : 1; // Should the temperature blink on the cool
|
||||||
// down screen until its <50C
|
// down screen until its <50C
|
||||||
uint8_t detailedIDLE : 1; // Detailed idle screen
|
uint8_t detailedIDLE : 1; // Detailed idle screen
|
||||||
uint8_t detailedSoldering : 1; // Detailed soldering screens
|
uint8_t detailedSoldering : 1; // Detailed soldering screens
|
||||||
uint8_t temperatureInF : 1; // Should the temp be in F or C (true is F)
|
uint8_t temperatureInF : 1; // Should the temp be in F or C (true is F)
|
||||||
uint8_t descriptionScrollSpeed : 1; // Description scroll speed
|
uint8_t descriptionScrollSpeed : 1; // Description scroll speed
|
||||||
uint8_t lockingMode : 2; // Store the locking mode
|
uint8_t lockingMode : 2; // Store the locking mode
|
||||||
uint8_t KeepAwakePulse; // Keep Awake pulse power in 0.1 watts (10 = 1Watt)
|
uint8_t KeepAwakePulse; // Keep Awake pulse power in 0.1 watts (10 = 1Watt)
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
#include "stdint.h"
|
#include "stdint.h"
|
||||||
extern const uint8_t USER_FONT_12[];
|
extern const uint8_t USER_FONT_12[];
|
||||||
extern const uint8_t USER_FONT_6x8[];
|
extern const uint8_t USER_FONT_6x8[];
|
||||||
extern const bool HasFahrenheit;
|
extern const bool HasFahrenheit;
|
||||||
|
|
||||||
extern const char *SettingsShortNames[29][2];
|
extern const char *SettingsShortNames[29][2];
|
||||||
extern const char *SettingsDescriptions[29];
|
extern const char *SettingsDescriptions[29];
|
||||||
|
|||||||
@@ -53,21 +53,21 @@ void resetSettings() {
|
|||||||
systemSettings.SleepTemp = SLEEP_TEMP; // Temperature the iron sleeps at - default 150.0 C
|
systemSettings.SleepTemp = SLEEP_TEMP; // Temperature the iron sleeps at - default 150.0 C
|
||||||
systemSettings.SleepTime = SLEEP_TIME; // How many seconds/minutes we wait until going
|
systemSettings.SleepTime = SLEEP_TIME; // How many seconds/minutes we wait until going
|
||||||
// to sleep - default 1 min
|
// to sleep - default 1 min
|
||||||
systemSettings.SolderingTemp = SOLDERING_TEMP; // Default soldering temp is 320.0 C
|
systemSettings.SolderingTemp = SOLDERING_TEMP; // Default soldering temp is 320.0 C
|
||||||
systemSettings.minDCVoltageCells = CUT_OUT_SETTING; // default to no cut-off voltage
|
systemSettings.minDCVoltageCells = CUT_OUT_SETTING; // default to no cut-off voltage
|
||||||
systemSettings.QCIdealVoltage = 0; // Default to 9V for QC3.0 Voltage
|
systemSettings.QCIdealVoltage = 0; // Default to 9V for QC3.0 Voltage
|
||||||
systemSettings.version = SETTINGSVERSION; // Store the version number to allow for easier upgrades
|
systemSettings.version = SETTINGSVERSION; // Store the version number to allow for easier upgrades
|
||||||
systemSettings.detailedSoldering = DETAILED_SOLDERING; // Detailed soldering screen
|
systemSettings.detailedSoldering = DETAILED_SOLDERING; // Detailed soldering screen
|
||||||
systemSettings.detailedIDLE = DETAILED_IDLE; // Detailed idle screen (off for first time users)
|
systemSettings.detailedIDLE = DETAILED_IDLE; // Detailed idle screen (off for first time users)
|
||||||
systemSettings.OrientationMode = ORIENTATION_MODE; // Default to automatic
|
systemSettings.OrientationMode = ORIENTATION_MODE; // Default to automatic
|
||||||
systemSettings.sensitivity = SENSITIVITY; // Default high sensitivity
|
systemSettings.sensitivity = SENSITIVITY; // Default high sensitivity
|
||||||
systemSettings.voltageDiv = VOLTAGE_DIV; // Default divider from schematic
|
systemSettings.voltageDiv = VOLTAGE_DIV; // Default divider from schematic
|
||||||
systemSettings.ShutdownTime = SHUTDOWN_TIME; // How many minutes until the unit turns itself off
|
systemSettings.ShutdownTime = SHUTDOWN_TIME; // How many minutes until the unit turns itself off
|
||||||
systemSettings.BoostTemp = BOOST_TEMP; // default to 400C
|
systemSettings.BoostTemp = BOOST_TEMP; // default to 400C
|
||||||
systemSettings.autoStartMode = AUTO_START_MODE; // Auto start off for safety
|
systemSettings.autoStartMode = AUTO_START_MODE; // Auto start off for safety
|
||||||
systemSettings.lockingMode = LOCKING_MODE; // Disable locking for safety
|
systemSettings.lockingMode = LOCKING_MODE; // Disable locking for safety
|
||||||
systemSettings.coolingTempBlink = COOLING_TEMP_BLINK; // Blink the temperature on the cooling screen when its > 50C
|
systemSettings.coolingTempBlink = COOLING_TEMP_BLINK; // Blink the temperature on the cooling screen when its > 50C
|
||||||
systemSettings.temperatureInF = TEMPERATURE_INF; // default to 0
|
systemSettings.temperatureInF = TEMPERATURE_INF; // default to 0
|
||||||
systemSettings.descriptionScrollSpeed = DESCRIPTION_SCROLL_SPEED; // default to slow
|
systemSettings.descriptionScrollSpeed = DESCRIPTION_SCROLL_SPEED; // default to slow
|
||||||
systemSettings.CalibrationOffset = CALIBRATION_OFFSET; // the adc offset in uV
|
systemSettings.CalibrationOffset = CALIBRATION_OFFSET; // the adc offset in uV
|
||||||
systemSettings.powerLimit = POWER_LIMIT; // 30 watts default limit
|
systemSettings.powerLimit = POWER_LIMIT; // 30 watts default limit
|
||||||
|
|||||||
@@ -157,15 +157,16 @@ const menuitem solderingMenu[] = {
|
|||||||
{NULL, NULL, NULL} // end of menu marker. DO NOT REMOVE
|
{NULL, NULL, NULL} // end of menu marker. DO NOT REMOVE
|
||||||
};
|
};
|
||||||
const menuitem UIMenu[] = {
|
const menuitem UIMenu[] = {
|
||||||
/*
|
/*
|
||||||
// Language
|
// Language
|
||||||
* Scrolling Speed
|
* Scrolling Speed
|
||||||
* Temperature Unit
|
* Temperature Unit
|
||||||
* Display orientation
|
* Display orientation
|
||||||
* Cooldown blink
|
* Cooldown blink
|
||||||
* Reverse Temp change buttons + -
|
* Reverse Temp change buttons + -
|
||||||
*/
|
*/
|
||||||
{(const char *)SettingsDescriptions[5], settings_setTempF, settings_displayTempF}, /* Temperature units, this has to be the first element in the array to work with the logic in settings_enterUIMenu() */
|
{(const char *)SettingsDescriptions[5], settings_setTempF,
|
||||||
|
settings_displayTempF}, /* Temperature units, this has to be the first element in the array to work with the logic in settings_enterUIMenu() */
|
||||||
{(const char *)SettingsDescriptions[7], settings_setDisplayRotation, settings_displayDisplayRotation}, /*Display Rotation*/
|
{(const char *)SettingsDescriptions[7], settings_setDisplayRotation, settings_displayDisplayRotation}, /*Display Rotation*/
|
||||||
{(const char *)SettingsDescriptions[10], settings_setCoolingBlinkEnabled, settings_displayCoolingBlinkEnabled}, /*Cooling blink warning*/
|
{(const char *)SettingsDescriptions[10], settings_setCoolingBlinkEnabled, settings_displayCoolingBlinkEnabled}, /*Cooling blink warning*/
|
||||||
{(const char *)SettingsDescriptions[15], settings_setScrollSpeed, settings_displayScrollSpeed}, /*Scroll Speed for descriptions*/
|
{(const char *)SettingsDescriptions[15], settings_setScrollSpeed, settings_displayScrollSpeed}, /*Scroll Speed for descriptions*/
|
||||||
|
|||||||
@@ -70,8 +70,7 @@ void gui_drawTipTemp(bool symbol) {
|
|||||||
uint32_t Temp = 0;
|
uint32_t Temp = 0;
|
||||||
if (systemSettings.temperatureInF) {
|
if (systemSettings.temperatureInF) {
|
||||||
Temp = TipThermoModel::getTipInF();
|
Temp = TipThermoModel::getTipInF();
|
||||||
} else
|
} else {
|
||||||
{
|
|
||||||
Temp = TipThermoModel::getTipInC();
|
Temp = TipThermoModel::getTipInC();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -274,8 +273,7 @@ static void gui_solderingTempAdjust() {
|
|||||||
OLED::printNumber(systemSettings.SolderingTemp, 3);
|
OLED::printNumber(systemSettings.SolderingTemp, 3);
|
||||||
if (systemSettings.temperatureInF)
|
if (systemSettings.temperatureInF)
|
||||||
OLED::drawSymbol(0);
|
OLED::drawSymbol(0);
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
OLED::drawSymbol(1);
|
OLED::drawSymbol(1);
|
||||||
}
|
}
|
||||||
OLED::print(SymbolSpace);
|
OLED::print(SymbolSpace);
|
||||||
@@ -410,7 +408,7 @@ static bool shouldBeSleeping(bool inAutoStart) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (lastMovementTime > 0 || lastButtonTime > 0) {
|
if (lastMovementTime > 0 || lastButtonTime > 0) {
|
||||||
if ((xTaskGetTickCount() - lastMovementTime) > getSleepTimeout() && (xTaskGetTickCount() - lastButtonTime) > getSleepTimeout()) {
|
if (((xTaskGetTickCount() - lastMovementTime) > getSleepTimeout()) && ((xTaskGetTickCount() - lastButtonTime) > getSleepTimeout())) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -419,7 +417,7 @@ static bool shouldBeSleeping(bool inAutoStart) {
|
|||||||
#ifdef HALL_SENSOR
|
#ifdef HALL_SENSOR
|
||||||
// If the hall effect sensor is enabled in the build, check if its over
|
// If the hall effect sensor is enabled in the build, check if its over
|
||||||
// threshold, and if so then we force sleep
|
// threshold, and if so then we force sleep
|
||||||
if (lookupHallEffectThreshold()) {
|
if (getHallSensorFitted() && lookupHallEffectThreshold()) {
|
||||||
int16_t hallEffectStrength = getRawHallEffect();
|
int16_t hallEffectStrength = getRawHallEffect();
|
||||||
if (hallEffectStrength < 0)
|
if (hallEffectStrength < 0)
|
||||||
hallEffectStrength = -hallEffectStrength;
|
hallEffectStrength = -hallEffectStrength;
|
||||||
|
|||||||
Reference in New Issue
Block a user