2024-10-29 01:07:00 +05:30
|
|
|
#include <stdint.h>
|
|
|
|
#include "tm4c123gh6pm.h"
|
|
|
|
|
2024-10-31 10:58:00 +05:30
|
|
|
#define I2C0_MSA_R (*((volatile uint32_t *)0x40020000))
|
|
|
|
#define I2C0_MDR_R (*((volatile uint32_t *)0x40020008))
|
|
|
|
#define I2C0_MCS_R (*((volatile uint32_t *)0x40020004))
|
2024-10-29 09:15:58 +05:30
|
|
|
|
2024-10-31 10:58:00 +05:30
|
|
|
#define MCP4725_ADDR 0x60 // MCP4725 I2C Address
|
2024-10-29 09:15:58 +05:30
|
|
|
|
2024-10-31 10:58:00 +05:30
|
|
|
void I2C0_Init(void) {
|
|
|
|
SYSCTL_RCGCI2C_R |= 0x01; // Enable I2C0 module
|
|
|
|
SYSCTL_RCGCGPIO_R |= 0x02; // Enable GPIOB for I2C
|
|
|
|
while ((SYSCTL_PRGPIO_R & 0x02) == 0) {}; // Wait for port B to be ready
|
|
|
|
|
|
|
|
GPIO_PORTB_AFSEL_R |= 0x0C; // Enable alternate function for PB2, PB3
|
|
|
|
GPIO_PORTB_ODR_R |= 0x08; // Enable open-drain on PB3 (SDA)
|
|
|
|
GPIO_PORTB_DEN_R |= 0x0C; // Enable digital I/O on PB2, PB3
|
|
|
|
GPIO_PORTB_PCTL_R = (GPIO_PORTB_PCTL_R & 0xFFFF00FF) + 0x00003300; // Configure PB2, PB3 for I2C
|
|
|
|
|
|
|
|
I2C0_MCR_R = 0x10; // Master mode
|
|
|
|
I2C0_MTPR_R = 24; // Set SCL to ~100kHz
|
|
|
|
}
|
|
|
|
|
|
|
|
void I2C0_Send(uint8_t slave_addr, uint16_t data) {
|
|
|
|
I2C0_MSA_R = (slave_addr << 1) & 0xFE; // Transmit to MCP4725
|
|
|
|
I2C0_MDR_R = (data >> 8); // Send upper 8 bits
|
|
|
|
I2C0_MCS_R = 0x03; // Start and run
|
|
|
|
|
|
|
|
while (I2C0_MCS_R & 0x01) {}; // Wait until done
|
|
|
|
I2C0_MDR_R = data & 0xFF; // Send lower 8 bits
|
|
|
|
I2C0_MCS_R = 0x05; // Stop and run
|
|
|
|
|
|
|
|
while (I2C0_MCS_R & 0x01) {}; // Wait until done
|
|
|
|
}
|
|
|
|
|
|
|
|
void DAC_Write(uint16_t value) {
|
|
|
|
uint16_t data = (value & 0x0FFF) << 4; // Left align 12-bit value
|
|
|
|
I2C0_Send(MCP4725_ADDR, data);
|
|
|
|
}
|
|
|
|
|
|
|
|
int main(void) {
|
|
|
|
I2C0_Init();
|
|
|
|
|
|
|
|
uint16_t value = 0;
|
|
|
|
while (1) {
|
|
|
|
DAC_Write(value);
|
|
|
|
value = (value + 1) % 4096; // Increment and wrap around at 12-bit limit for sawtooth
|
|
|
|
for (volatile int delay = 0; delay < 5000; delay++); // Delay for waveform frequency
|
|
|
|
}
|
|
|
|
}
|