Final code
This commit is contained in:
		
							parent
							
								
									5c02c4976c
								
							
						
					
					
						commit
						6a9fe58149
					
				
							
								
								
									
										46
									
								
								Lab_9.c
								
								
								
								
							
							
						
						
									
										46
									
								
								Lab_9.c
								
								
								
								
							| 
						 | 
				
			
			@ -1,6 +1,50 @@
 | 
			
		|||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include "tm4c123gh6pm.h"
 | 
			
		||||
 | 
			
		||||
#define I2C0_MSA_R (*((volatile uint32_t *)0x40020000))
 | 
			
		||||
#define I2C0_MDR_R (*((volatile uint32_t *)0x40020008))
 | 
			
		||||
#define I2C0_MCS_R (*((volatile uint32_t *)0x40020004))
 | 
			
		||||
 | 
			
		||||
#define MCP4725_ADDR 0x60  // MCP4725 I2C Address
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue