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 <stdint.h>
 | 
				
			||||||
#include <stdbool.h>
 | 
					 | 
				
			||||||
#include "tm4c123gh6pm.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