From 36f179566bb83ce9ea740fdfcd6b623926a356b5 Mon Sep 17 00:00:00 2001 From: Mitchell Marino Date: Mon, 17 Nov 2025 12:07:01 -0600 Subject: [PATCH] idek --- src/i2c_slave.c | 43 +++++++++++++++++-------------------------- src/i2c_slave.h | 5 +++-- 2 files changed, 20 insertions(+), 28 deletions(-) diff --git a/src/i2c_slave.c b/src/i2c_slave.c index bbd775b..58fd05b 100644 --- a/src/i2c_slave.c +++ b/src/i2c_slave.c @@ -1,41 +1,32 @@ +#include "ch32v00x.h" #include "i2c_slave.h" #include // https://pallavaggarwal.in/2023/10/05/ch32v003-programming-i2c-eeprom/ void i2c_init() { - GPIO_InitTypeDef GPIO_InitStructure={0}; - I2C_InitTypeDef I2C_InitTSturcture={0}; + // Enable clocks + RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; + RCC->APB1ENR |= RCC_APB1ENR_I2C1EN; - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE); - RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); + // Set PB6/PB7 to AF Open-Drain + GPIOB->CFGLR &= ~((0xF << (4 * 6)) | (0xF << (4 * 7))); + GPIOB->CFGLR |= (0xF << (4 * 6)) | (0xF << (4 * 7)); // 0xF = AF OD 50MHz - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(GPIOC, &GPIO_InitStructure); + I2C1->CTLR1 = I2C_CTLR1_SWRST; + I2C1->CTLR1 = 0; - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(GPIOC, &GPIO_InitStructure); + I2C1->OADDR1 = (address << 1) & 0xFE; + I2C1->OADDR1 |= I2C_OADDR1_ADDMODE; // 7-bit addr - I2C_InitTSturcture.I2C_ClockSpeed = 100*1000; - I2C_InitTSturcture.I2C_Mode = I2C_Mode_I2C; - I2C_InitTSturcture.I2C_DutyCycle = I2C_DutyCycle_2; - I2C_InitTSturcture.I2C_OwnAddress1 = I2C_SLAVE_ADDR; - I2C_InitTSturcture.I2C_Ack = I2C_Ack_Enable; - I2C_InitTSturcture.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; + I2C1->CTLR2 = 36; // 36 MHz APB1 - NVIC_EnableIRQ(I2C1_EV_IRQn); // Event interrupt - NVIC_SetPriority(I2C1_EV_IRQn, 2 << 4); - NVIC_EnableIRQ(I2C1_ER_IRQn); // Error interrupt - NVIC_SetPriority(I2C1_ER_IRQn, 2 << 4); + I2C1->STAR1 = 0; + I2C1->STAR2 = 0; - I2C_Init(I2C1, &I2C_InitTSturcture); + I2C1->CTLR1 |= I2C_CTLR1_ACK | I2C_CTLR1_PE; + I2C1->CTLR1 |= I2C_CTLR1_ITBUFEN | I2C_CTLR1_ITEVTEN; - I2C_Cmd(I2C1, ENABLE); - - I2C_AcknowledgeConfig(I2C1, ENABLE); + NVIC_EnableIRQ(I2C1_EV_IRQn); } void I2C1_EV_IRQHandler(void) { diff --git a/src/i2c_slave.h b/src/i2c_slave.h index 2108757..7708065 100644 --- a/src/i2c_slave.h +++ b/src/i2c_slave.h @@ -7,7 +7,8 @@ void i2c_init(); -void I2C1_EV_IRQHandler(void) __attribute__((interrupt)); -void I2C1_ER_IRQHandler(void) __attribute__((interrupt)); + +void I2C1_EV_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); +void I2C1_ER_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); #endif /* I2C_SLAVE_H */ \ No newline at end of file