|
@@ -497,8 +497,22 @@ Byte 2: low byte of DAC
|
|
|
return true;
|
|
return true;
|
|
|
}*/
|
|
}*/
|
|
|
|
|
|
|
|
-/**Function for FAST write command, sending values over I2c to every channel of DAC**/
|
|
|
|
|
|
|
+//The device updates all DAC analog output(vout) at the same time
|
|
|
|
|
+
|
|
|
|
|
+void update_DAC_Output() {
|
|
|
|
|
+ uint8_t general_call_command = 0x08; // General Call Update Command
|
|
|
|
|
+ while (DL_I2C_getControllerStatus(I2C_controller_INST) & DL_I2C_CONTROLLER_STATUS_BUSY_BUS);
|
|
|
|
|
+ DL_I2C_fillControllerTXFIFO(I2C_controller_INST, &general_call_command, 1);
|
|
|
|
|
|
|
|
|
|
+ // Start I2C transaction
|
|
|
|
|
+ DL_I2C_startControllerTransfer(I2C_controller_INST, 0x00, DL_I2C_CONTROLLER_DIRECTION_TX, 1);
|
|
|
|
|
+
|
|
|
|
|
+ while (DL_I2C_getControllerStatus(I2C_controller_INST) & DL_I2C_CONTROLLER_STATUS_BUSY_BUS);
|
|
|
|
|
+
|
|
|
|
|
+ printf("DAC Outputs Updated via General Call Software Update!\n");
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/**Function for FAST write command, sending values over I2c to every channel of DAC**/
|
|
|
bool fastWrite(uint16_t channel_a_value){
|
|
bool fastWrite(uint16_t channel_a_value){
|
|
|
|
|
|
|
|
/*DAC has a 12 bit resolution that ranges from 0 to 4095.
|
|
/*DAC has a 12 bit resolution that ranges from 0 to 4095.
|
|
@@ -529,18 +543,20 @@ bool fastWrite(uint16_t channel_a_value){
|
|
|
// **Wait for I2C Bus to be Free**
|
|
// **Wait for I2C Bus to be Free**
|
|
|
while (DL_I2C_getControllerStatus(I2C_controller_INST) & DL_I2C_CONTROLLER_STATUS_BUSY_BUS);
|
|
while (DL_I2C_getControllerStatus(I2C_controller_INST) & DL_I2C_CONTROLLER_STATUS_BUSY_BUS);
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
// **Start I2C Write Transaction**
|
|
// **Start I2C Write Transaction**
|
|
|
DL_I2C_startControllerTransfer(I2C_controller_INST, DEF_TARGET_ADDR_DAC, DL_I2C_CONTROLLER_DIRECTION_TX, 8);
|
|
DL_I2C_startControllerTransfer(I2C_controller_INST, DEF_TARGET_ADDR_DAC, DL_I2C_CONTROLLER_DIRECTION_TX, 8);
|
|
|
|
|
|
|
|
- // **Step 4: Load Configuration Byte into TX FIFO**
|
|
|
|
|
- for (uint8_t i=0; i < 8; i++){
|
|
|
|
|
- DL_I2C_fillControllerTXFIFO(I2C_controller_INST, &output_buffer[i], 1);
|
|
|
|
|
|
|
+ // **Load Configuration Byte into TX FIFO**
|
|
|
|
|
+ DL_I2C_fillControllerTXFIFO(I2C_controller_INST, (uint8_t*)&output_buffer, 8);
|
|
|
|
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
// **Ensure STOP Condition is Sent**
|
|
// **Ensure STOP Condition is Sent**
|
|
|
while (DL_I2C_getControllerStatus(I2C_controller_INST) & DL_I2C_CONTROLLER_STATUS_BUSY_BUS);
|
|
while (DL_I2C_getControllerStatus(I2C_controller_INST) & DL_I2C_CONTROLLER_STATUS_BUSY_BUS);
|
|
|
printf("DAC Fast write Successful!\n");
|
|
printf("DAC Fast write Successful!\n");
|
|
|
|
|
+ update_DAC_Output();
|
|
|
return true;
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
}
|
|
@@ -583,19 +599,7 @@ bool fastWrite(uint16_t channel_a_value){
|
|
|
printf("MCP4728 Registers Read Successfully!\n");
|
|
printf("MCP4728 Registers Read Successfully!\n");
|
|
|
}
|
|
}
|
|
|
*/
|
|
*/
|
|
|
-//The device updates all DAC analog output(vout) at the same time
|
|
|
|
|
-
|
|
|
|
|
-/*void update_DAC_Output() {
|
|
|
|
|
- uint8_t general_call_command = 0x08; // General Call Update Command
|
|
|
|
|
|
|
|
|
|
- // Start I2C transaction
|
|
|
|
|
- DL_I2C_startControllerTransfer(I2C_controller_INST, DEF_TARGET_ADDR_DAC, DL_I2C_CONTROLLER_DIRECTION_TX, 1);
|
|
|
|
|
- DL_I2C_fillControllerTXFIFO(I2C_controller_INST, &general_call_command, 1);
|
|
|
|
|
-
|
|
|
|
|
- while (DL_I2C_getControllerStatus(I2C_controller_INST) & DL_I2C_CONTROLLER_STATUS_BUSY_BUS);
|
|
|
|
|
-
|
|
|
|
|
- printf("DAC Outputs Updated via General Call Software Update!\n");
|
|
|
|
|
-}*/
|
|
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
|
DAC Function:
|
|
DAC Function:
|
|
@@ -703,7 +707,7 @@ int main(void)
|
|
|
// **Step 2: Select ADC Channel via Multiplexer**
|
|
// **Step 2: Select ADC Channel via Multiplexer**
|
|
|
printf("Selecting Multiplexer Channel...\n");
|
|
printf("Selecting Multiplexer Channel...\n");
|
|
|
Multiplexer_SelectChannel(ADC_I2C_CHANNEL);
|
|
Multiplexer_SelectChannel(ADC_I2C_CHANNEL);
|
|
|
- I2C_scanBus();
|
|
|
|
|
|
|
+ //I2C_scanBus();
|
|
|
// **Step 3: Enable I2C Interrupts**
|
|
// **Step 3: Enable I2C Interrupts**
|
|
|
//NVIC_EnableIRQ(I2C_controller_INST_INT_IRQN);
|
|
//NVIC_EnableIRQ(I2C_controller_INST_INT_IRQN);
|
|
|
//NVIC_EnableIRQ(I2C_target_INST_INT_IRQN);
|
|
//NVIC_EnableIRQ(I2C_target_INST_INT_IRQN);
|
|
@@ -722,14 +726,14 @@ int main(void)
|
|
|
printf("Configuring ADC...\n");
|
|
printf("Configuring ADC...\n");
|
|
|
|
|
|
|
|
//**Set Configuration Register for ADC**
|
|
//**Set Configuration Register for ADC**
|
|
|
- SetConfiguration(channel, resolution, continuous, gain); // CH1, 16-bit, Continuous mode, Gain x1
|
|
|
|
|
|
|
+ //SetConfiguration(channel, resolution, continuous, gain); // CH1, 16-bit, Continuous mode, Gain x1
|
|
|
|
|
|
|
|
while (1)
|
|
while (1)
|
|
|
{
|
|
{
|
|
|
// Read ADC Value and DAC values:
|
|
// Read ADC Value and DAC values:
|
|
|
- int16_t adc_value = Read_ADC_Data(resolution);
|
|
|
|
|
- Convert_ADC_To_Voltage(adc_value, resolution, gain);
|
|
|
|
|
- delay_cycles(10000);
|
|
|
|
|
|
|
+ //int16_t adc_value = Read_ADC_Data(resolution);
|
|
|
|
|
+ //Convert_ADC_To_Voltage(adc_value, resolution, gain);
|
|
|
|
|
+ //delay_cycles(10000);
|
|
|
fastWrite(3300);
|
|
fastWrite(3300);
|
|
|
|
|
|
|
|
//Add Delay for Next Conversion**
|
|
//Add Delay for Next Conversion**
|
|
@@ -824,14 +828,14 @@ void I2C_target_INST_IRQHandler(void) {
|
|
|
static bool DataRx= false;
|
|
static bool DataRx= false;
|
|
|
static uint16_t registerAddress=0;
|
|
static uint16_t registerAddress=0;
|
|
|
|
|
|
|
|
- printf("I2C Interrupt Triggered to MCU (TARGET)!\n");
|
|
|
|
|
|
|
+ //printf("I2C Interrupt Triggered to MCU (TARGET)!\n");
|
|
|
|
|
|
|
|
uint32_t status = DL_I2C_getPendingInterrupt(I2C_target_INST);
|
|
uint32_t status = DL_I2C_getPendingInterrupt(I2C_target_INST);
|
|
|
switch (status) {
|
|
switch (status) {
|
|
|
|
|
|
|
|
/* START condition detected */
|
|
/* START condition detected */
|
|
|
case DL_I2C_IIDX_TARGET_START:
|
|
case DL_I2C_IIDX_TARGET_START:
|
|
|
- printf("START condition detected.\n");
|
|
|
|
|
|
|
+ //printf("START condition detected.\n");
|
|
|
gTxCount= 0;
|
|
gTxCount= 0;
|
|
|
gRxCount= 0;
|
|
gRxCount= 0;
|
|
|
DataRx= false;
|
|
DataRx= false;
|
|
@@ -840,14 +844,14 @@ void I2C_target_INST_IRQHandler(void) {
|
|
|
|
|
|
|
|
/* STOP condition detected */
|
|
/* STOP condition detected */
|
|
|
case DL_I2C_IIDX_TARGET_STOP:
|
|
case DL_I2C_IIDX_TARGET_STOP:
|
|
|
- printf("STOP condition detected.\n");
|
|
|
|
|
|
|
+ //printf("STOP condition detected.\n");
|
|
|
if (DataRx == true){
|
|
if (DataRx == true){
|
|
|
- printf("Data received from Pi: ");
|
|
|
|
|
|
|
+ //printf("Data received from Pi: ");
|
|
|
for (uint8_t i = 0; i < gRxCount; i++) {
|
|
for (uint8_t i = 0; i < gRxCount; i++) {
|
|
|
- printf("0x%02X ", gRxBuffer[i]);
|
|
|
|
|
|
|
+ //printf("0x%02X ", gRxBuffer[i]);
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
- printf("\n");
|
|
|
|
|
|
|
+ //printf("\n");
|
|
|
DataRx= false;
|
|
DataRx= false;
|
|
|
}
|
|
}
|
|
|
DL_I2C_flushTargetTXFIFO(I2C_target_INST);
|
|
DL_I2C_flushTargetTXFIFO(I2C_target_INST);
|
|
@@ -855,13 +859,14 @@ void I2C_target_INST_IRQHandler(void) {
|
|
|
|
|
|
|
|
/* RX FIFO trigger (Pi is writing data to MCU) */
|
|
/* RX FIFO trigger (Pi is writing data to MCU) */
|
|
|
case DL_I2C_IIDX_TARGET_RXFIFO_TRIGGER:
|
|
case DL_I2C_IIDX_TARGET_RXFIFO_TRIGGER:
|
|
|
- printf("receiving data from Pi.\n");
|
|
|
|
|
|
|
+ //printf("receiving data from Pi.\n");
|
|
|
DataRx= true;
|
|
DataRx= true;
|
|
|
while (!DL_I2C_isTargetRXFIFOEmpty(I2C_target_INST)) {
|
|
while (!DL_I2C_isTargetRXFIFOEmpty(I2C_target_INST)) {
|
|
|
if (gRxCount == 0) {
|
|
if (gRxCount == 0) {
|
|
|
// First byte received is the register address
|
|
// First byte received is the register address
|
|
|
registerAddress = DL_I2C_receiveTargetData(I2C_target_INST);
|
|
registerAddress = DL_I2C_receiveTargetData(I2C_target_INST);
|
|
|
- printf("Register Address Set: 0x%02X\n", registerAddress);
|
|
|
|
|
|
|
+ DL_I2C_flushTargetTXFIFO(I2C_target_INST);
|
|
|
|
|
+ //printf("Register Address Set: 0x%02X\n", registerAddress);
|
|
|
}
|
|
}
|
|
|
else if (registerAddress < REGISTER_SIZE) {
|
|
else if (registerAddress < REGISTER_SIZE) {
|
|
|
//Storing the received data from the controller correctly
|
|
//Storing the received data from the controller correctly
|
|
@@ -880,16 +885,16 @@ void I2C_target_INST_IRQHandler(void) {
|
|
|
|
|
|
|
|
/* TX FIFO trigger (Pi is reading data from MCU) */
|
|
/* TX FIFO trigger (Pi is reading data from MCU) */
|
|
|
case DL_I2C_IIDX_TARGET_TXFIFO_TRIGGER:
|
|
case DL_I2C_IIDX_TARGET_TXFIFO_TRIGGER:
|
|
|
- printf("transmitting data to Pi...\n");
|
|
|
|
|
- if (!DL_I2C_isTargetTXFIFOFull(I2C_target_INST)) {
|
|
|
|
|
|
|
+ //printf("transmitting data to Pi...\n");
|
|
|
|
|
+ if(!DL_I2C_isTargetTXFIFOFull(I2C_target_INST)) {
|
|
|
|
|
|
|
|
if (registerAddress < REGISTER_SIZE) {
|
|
if (registerAddress < REGISTER_SIZE) {
|
|
|
//DL_I2C_fillTargetTXFIFO(I2C_0_INST, &gTxBuffer[gTxCount], 1);
|
|
//DL_I2C_fillTargetTXFIFO(I2C_0_INST, &gTxBuffer[gTxCount], 1);
|
|
|
// Retrieve stored value from the correct register
|
|
// Retrieve stored value from the correct register
|
|
|
uint8_t value = registers[registerAddress];
|
|
uint8_t value = registers[registerAddress];
|
|
|
- uint8_t value_test[2] = { 0x01, 0x03 };
|
|
|
|
|
- DL_I2C_fillTargetTXFIFO(I2C_target_INST, &value_test[0], 2);
|
|
|
|
|
- printf("Sending to 0x%02X: 0x%02X\n", registerAddress, value); // Debugging
|
|
|
|
|
|
|
+ //uint8_t value_test[2] = { 0x01, 0x03 };
|
|
|
|
|
+ DL_I2C_fillTargetTXFIFO(I2C_target_INST, &value, 1);
|
|
|
|
|
+ //printf("Sending to 0x%02X: 0x%02X\n", registerAddress, value); // Debugging
|
|
|
} else {
|
|
} else {
|
|
|
// **Fix: Avoid infinite while loop**
|
|
// **Fix: Avoid infinite while loop**
|
|
|
printf("WARNING: TX Buffer Underflow! Sending default value.\n");
|
|
printf("WARNING: TX Buffer Underflow! Sending default value.\n");
|