diff --git a/Projects/epwm_test/Start_rfm.pmp b/Projects/epwm_test/Start_rfm.pmp index a346eb2..749026d 100644 Binary files a/Projects/epwm_test/Start_rfm.pmp and b/Projects/epwm_test/Start_rfm.pmp differ diff --git a/Projects/epwm_test/epwm_test.c b/Projects/epwm_test/epwm_test.c index 531f26d..52b4840 100644 --- a/Projects/epwm_test/epwm_test.c +++ b/Projects/epwm_test/epwm_test.c @@ -17,6 +17,7 @@ #include "init_perif.h" #include"frm_uart.h" #include "spi_init.h" + #include "BL25CM1A.h" #include "GD25Q16ETIGR.h" // diff --git a/Projects/epwm_test/src/gpio_init.c b/Projects/epwm_test/src/gpio_init.c index a742bc0..8d9dc03 100644 --- a/Projects/epwm_test/src/gpio_init.c +++ b/Projects/epwm_test/src/gpio_init.c @@ -9,14 +9,14 @@ void GpioInit(void) { EALLOW; - GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; - GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0; - GpioCtrlRegs.GPAGMUX1.bit.GPIO0 = 0; - GpioCtrlRegs.GPAGMUX1.bit.GPIO1 = 0; - GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; - GpioCtrlRegs.GPADIR.bit.GPIO1 = 1; - GpioDataRegs.GPADAT.bit.GPIO0 = 0; - GpioDataRegs.GPADAT.bit.GPIO1 = 0; + GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 0; + GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 0; + GpioCtrlRegs.GPAGMUX2.bit.GPIO20 = 0; + GpioCtrlRegs.GPAGMUX2.bit.GPIO21 = 0; + GpioCtrlRegs.GPADIR.bit.GPIO20 = 1; + GpioCtrlRegs.GPADIR.bit.GPIO21 = 1; + GpioDataRegs.GPADAT.bit.GPIO20 = 0; + GpioDataRegs.GPADAT.bit.GPIO21 = 0; GpioCtrlRegs.GPAGMUX2.bit.GPIO18 = 0; GpioCtrlRegs.GPAGMUX2.bit.GPIO18 = 0; @@ -25,13 +25,13 @@ void GpioInit(void) EDIS; } -void Gpio0out(uint16_t out_bit) +void Gpio20out(uint16_t out_bit) { - GpioDataRegs.GPADAT.bit.GPIO0 = out_bit; + GpioDataRegs.GPADAT.bit.GPIO20 = out_bit; } -void Gpio1out(uint16_t out_bit) +void Gpio21out(uint16_t out_bit) { - GpioDataRegs.GPADAT.bit.GPIO1 = out_bit; + GpioDataRegs.GPADAT.bit.GPIO21 = out_bit; } diff --git a/Projects/epwm_test/src/gpio_init.h b/Projects/epwm_test/src/gpio_init.h index 9c465b6..bc634b2 100644 --- a/Projects/epwm_test/src/gpio_init.h +++ b/Projects/epwm_test/src/gpio_init.h @@ -10,7 +10,7 @@ void GpioInit(void); -void Gpio0out(uint16_t out_bit); -void Gpio1out(uint16_t out_bit); +void Gpio20out(uint16_t out_bit); +void Gpio21out(uint16_t out_bit); #endif /* SRC_GPIO_INIT_H_ */ diff --git a/Projects/epwm_test/src/i2c_init.c b/Projects/epwm_test/src/i2c_init.c index 9a50b65..986c5ea 100644 --- a/Projects/epwm_test/src/i2c_init.c +++ b/Projects/epwm_test/src/i2c_init.c @@ -4,5 +4,211 @@ * Created on: 5 сент. 2023 г. * Author: seklyuts */ +#include "f28x_project.h" + +// +// Function to configure I2CA as Master Transmitter. +// + +#define I2C_SLAVE_ADDRESS 0x6AU +#define I2C_OWN_ADDRESS 0x30U +#define MAX_BUFFER_SIZE 0x10 +#define I2C_NUMBYTES 0x2U + +uint16_t I2C_TXdata[MAX_BUFFER_SIZE]; +uint16_t I2C_RXdata[MAX_BUFFER_SIZE]; + +// +// I2C GPIO pins +// +#define GPIO_PIN_SDAA 26U // GPIO number for I2C SDAA +#define GPIO_PIN_SCLA 27U // GPIO number for I2C SCLA + +void I2CMasterGpioInit(void) +{ + // + //Configure I2C pins + // + GPIO_SetupPinMux(GPIO_PIN_SDAA, GPIO_MUX_CPU1, 11); + GPIO_SetupPinOptions(GPIO_PIN_SDAA, GPIO_OUTPUT, GPIO_PULLUP); + GPIO_SetupPinMux(GPIO_PIN_SCLA, GPIO_MUX_CPU1, 11); + GPIO_SetupPinOptions(GPIO_PIN_SCLA, GPIO_OUTPUT, GPIO_PULLUP); +} + +void I2CMasterInit(uint16_t I2C_OwnAddress, uint16_t I2CSlave_Address) +{ + EALLOW; + // + // Must put I2C into reset before configuring it + // + I2caRegs.I2CMDR.all &= ~(0x20U); + + // + // I2C configuration. Use a 400kHz I2CCLK with a 50% duty cycle. + // + //I2C_initMaster(base, DEVICE_SYSCLK_FREQ, 400000, I2C_DUTYCYCLE_50); + I2caRegs.I2CPSC.all = 0xB; // Prescaler - need 7-12 Mhz on module clk + I2caRegs.I2CCLKL = 0x7; // NOTE: must be non zero + I2caRegs.I2CCLKH = 0x8; // NOTE: must be non zero + + + // + // Configure Master as a Transmitter + // + I2caRegs.I2CMDR.bit.MST = 0x1; + I2caRegs.I2CMDR.bit.TRX = 0x1; + + // + // Set data count + // + I2caRegs.I2CCNT = I2C_NUMBYTES; + + // + // Set the bit count to 8 bits per data byte + // + I2caRegs.I2CMDR.bit.BC = 0x0U; + + // + // Configure slave and own address + // + I2caRegs.I2COAR.all = I2C_OwnAddress; // Own address + I2caRegs.I2CSAR.all = I2CSlave_Address; // Slave address + + // + // Set emulation mode to FREE + // + I2caRegs.I2CMDR.bit.FREE = 0x1; + + // + //Clear all status + // + I2caRegs.I2CSTR.all = 0xFFFF; + + // + // Enable I2C Interrupts- RRDY + // + I2caRegs.I2CIER.all = 0x08; + + // + // Take I2C out of reset + // + I2caRegs.I2CMDR.all |= 0x0020; + + +} + +// +// Function to send data over I2C. +// +void I2CWrite(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition) +{ + + // + // Locals + // + uint16_t index = 0; + + // + // Configure slave address + // + I2caRegs.I2CSAR.all = slaveAddr; // Slave address + + // + // Configure I2C as Master Transmitter + // + I2caRegs.I2CMDR.bit.MST = 0x1; + I2caRegs.I2CMDR.bit.TRX = 0x1; + + // + //Set Data Count + // + I2caRegs.I2CCNT = byteCount; + + // + // send Start condition + // + I2caRegs.I2CMDR.bit.STT = 0x1; + + // + //transmit the bytes + // + for(index=0; index < I2C_NUMBYTES; index++) + { + I2caRegs.I2CDXR.all= I2C_TXdata[index]; + // + //wait till byte is sent + // + while(I2caRegs.I2CSTR.bit.BYTESENT != 0x1); + // + //clear the byte sent + // + I2caRegs.I2CSTR.bit.BYTESENT = 0x1; + } + + // + // Send STOP condition if specified + // + if(sendStopCondition) + { + I2caRegs.I2CMDR.bit.STP = 0x1; + while(I2caRegs.I2CMDR.bit.STP != 0x0); + + I2caRegs.I2CSTR.bit.BYTESENT = 0x1; + } +} + +// +// Function to read data over I2C. Returns the number of bytes read +// +uint16_t I2CRead(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition) +{ + // + // Configure slave address + // + I2caRegs.I2CSAR.all = slaveAddr; + + // + // Configure I2C in Master Receiver mode + // + I2caRegs.I2CMDR.bit.MST = 0x1; + I2caRegs.I2CMDR.bit.TRX = 0x0; + + // + //Set Data Count + // + //I2caRegs.I2CCNT = byteCount; + + // + // send Start condition + // + I2caRegs.I2CMDR.bit.STT = 0x1; + + uint16_t count = 0; + + // + // Read the received data into RX buffer + // + while(count < I2C_NUMBYTES) + { + if(I2caRegs.I2CSTR.bit.RRDY ==0x1) + { + I2C_RXdata[count] = I2caRegs.I2CDRR.all; + count++; + } + } + + // + // Send STOP condition + // + if(sendStopCondition) + { + I2caRegs.I2CMDR.bit.STP = 0x1; + while(I2caRegs.I2CMDR.bit.STP != 0x0); + + I2caRegs.I2CSTR.bit.BYTESENT = 0x1; + + } + return count; +} diff --git a/Projects/epwm_test/src/i2c_init.h b/Projects/epwm_test/src/i2c_init.h index 2b06b7f..77d3b0d 100644 --- a/Projects/epwm_test/src/i2c_init.h +++ b/Projects/epwm_test/src/i2c_init.h @@ -8,6 +8,12 @@ #ifndef SRC_I2C_INIT_H_ #define SRC_I2C_INIT_H_ - +// +// Function Prototypes +// +void I2CMasterInit(uint16_t I2CSlave_OwnAddress, uint16_t I2CSlave_Address); +void I2CWrite(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition); +uint16_t I2CRead(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition); +void I2CMasterGpioInit(void); #endif /* SRC_I2C_INIT_H_ */ diff --git a/Projects/epwm_test/src/init_perif.c b/Projects/epwm_test/src/init_perif.c index 834fbd8..ff4196a 100644 --- a/Projects/epwm_test/src/init_perif.c +++ b/Projects/epwm_test/src/init_perif.c @@ -12,6 +12,7 @@ #include "f2838x_sdfm_drivers.h" #include "gpio_init.h" #include "spi_init.h" +#include "i2c_init.h" void InitPerif(void) @@ -25,6 +26,7 @@ void InitPerif(void) SdfmInitEnable(); SpiaGpioInit(); + I2CMasterGpioInit(); // Clear all interrupts and initialize PIE vector table: @@ -63,6 +65,7 @@ void InitPerif(void) SdfmInitInterruptEn(); SdfmInit(SDFM1); SpiInit(); +// I2CMasterInit(); // // Enable global Interrupts and higher priority real-time debug events: // diff --git a/Projects/epwm_test/src/pwm_init.c b/Projects/epwm_test/src/pwm_init.c index 6d00272..11d3a7c 100644 --- a/Projects/epwm_test/src/pwm_init.c +++ b/Projects/epwm_test/src/pwm_init.c @@ -64,11 +64,11 @@ void PWMAllInit(void) PwmBrake100 = PERIOD_BRAKE; PwmMotor100 = PERIOD_MOTOR; - PWMInit(2, PERIOD_MOTOR, COMPLIMENTARY); - PWMInit(3, PERIOD_MOTOR, COMPLIMENTARY); - PWMInit(4, PERIOD_MOTOR, COMPLIMENTARY); - PWMInit(5, PERIOD_BRAKE, INDEPENDED); - PWMInit(6, PERIOD_BRAKE, INDEPENDED); + PWMInit(2, PwmMotor100, COMPLIMENTARY); + PWMInit(3, PwmMotor100, COMPLIMENTARY); + PWMInit(4, PwmMotor100, COMPLIMENTARY); + PWMInit(5, PwmBrake100, INDEPENDED); + PWMInit(6, PwmBrake100, INDEPENDED); // PWMInit(11, PERIOD, INDEPENDED); EALLOW; diff --git a/Projects/epwm_test/src/pwm_init.h b/Projects/epwm_test/src/pwm_init.h index c3638ba..a25805a 100644 --- a/Projects/epwm_test/src/pwm_init.h +++ b/Projects/epwm_test/src/pwm_init.h @@ -8,13 +8,21 @@ #ifndef SRC_PWM_INIT_H_ #define SRC_PWM_INIT_H_ +#define SYS_PWM_FREQUENCY 100000000.0 //Hz -#define PERIOD_BRAKE 1000 -#define PERIOD_MOTOR 5000 -#define EPWM_DB 150 -#define PERIOD_2 PERIOD_MOTOR/2 -#define PWM_MAX PERIOD_MOTOR - EPWM_DB -#define PWM_MIN EPWM_DB + +#define FREQUENCY_BRAKE 20000.0 //Hz +#define FREQUENCY_MOTOR 10000.0 //Hz +#define EPWM_DB_mkS 3.0 //mkS + +#define PERIOD_BRAKE (SYS_PWM_FREQUENCY/2/FREQUENCY_BRAKE) //Tic +#define PERIOD_MOTOR (SYS_PWM_FREQUENCY/2/FREQUENCY_MOTOR) //Tic + +#define EPWM_DB (EPWM_DB_mkS*SYS_PWM_FREQUENCY/2/1000000) + +#define PERIOD_2 (PERIOD_MOTOR/2) +#define PWM_MAX (PERIOD_MOTOR - EPWM_DB) +#define PWM_MIN EPWM_DB #define INDEPENDED 1 #define COMPLIMENTARY 0 diff --git a/Projects/epwm_test/src/pwm_interrupts.c b/Projects/epwm_test/src/pwm_interrupts.c index 7c0fa94..877895f 100644 --- a/Projects/epwm_test/src/pwm_interrupts.c +++ b/Projects/epwm_test/src/pwm_interrupts.c @@ -41,7 +41,7 @@ __interrupt void epwm1_isr(void) // __interrupt void epwm2_isr(void) { - Gpio0out(1); + Gpio20out(1); // if(AutoChange) pwm_AutoChange(2); // else EPwm2Regs.CMPA.bit.CMPA = PERIOD_MOTOR - PWM_motor; @@ -51,7 +51,7 @@ __interrupt void epwm2_isr(void) // Clear INT flag for this timer // EPwm2Regs.ETCLR.bit.INT = 1; - Gpio0out(0); + Gpio20out(0); // // Acknowledge this interrupt to receive more interrupts from group 3 // diff --git a/Projects/epwm_test/src/sdfm.c b/Projects/epwm_test/src/sdfm.c index 37b65f0..aafc89f 100644 --- a/Projects/epwm_test/src/sdfm.c +++ b/Projects/epwm_test/src/sdfm.c @@ -33,7 +33,7 @@ int16_t Filter4_Result[MAX_SAMPLES]; #pragma DATA_SECTION(Filter2_Result,"Filter2_RegsFile"); #pragma DATA_SECTION(Filter3_Result,"Filter3_RegsFile"); #pragma DATA_SECTION(Filter4_Result,"Filter4_RegsFile"); -int16_t ADC_Volt = 0; +int16_t ADC_ampere = 0; int16_t sdfmOffset = 0; uint16_t startInitCurrent = 0; uint16_t initDone = 0; @@ -153,7 +153,7 @@ __interrupt void Sdfm1_ISR(void) uint16_t i = 0; int32_t OffsetCount = 0; - Gpio1out(1); + Gpio21out(1); // // Wait for result from all the filters (SDIFLG) // @@ -180,12 +180,12 @@ __interrupt void Sdfm1_ISR(void) } } Filter1_Result[loopCounter1++] = SDFM1_READ_FILTER1_DATA_16BIT; - ADC_Volt = Filter1_Result[loopCounter1-1] - sdfmOffset; + ADC_ampere = Filter1_Result[loopCounter1-1] - sdfmOffset; } if(IntFlags & 0x100) { - ADC_Volt = 0; + ADC_ampere = 0; EALLOW; Sdfm1Regs.SDCPARM1.bit.MFIE = 0; EDIS; @@ -206,7 +206,7 @@ __interrupt void Sdfm1_ISR(void) // Acknowledge this __interrupt to receive more __interrupts from group 5 // PieCtrlRegs.PIEACK.all = PIEACK_GROUP5; - Gpio1out(0); + Gpio21out(0); } //Sdfm_clearFlagRegister