用C语言写一个STM32L4 寄存器版的从机I2C代码
时间: 2023-08-13 14:03:45 浏览: 63
以下是一个简单的从机I2C代码,使用STM32L4的寄存器编程:
```c
#include "stm32l4xx.h"
#define SLAVE_ADDRESS 0x50
void I2C1_Init(void);
void I2C1_EV_IRQHandler(void);
void I2C1_ER_IRQHandler(void);
int main(void)
{
I2C1_Init();
while (1) {
// 等待I2C中断
}
return 0;
}
void I2C1_Init(void)
{
// 使能GPIOB时钟
RCC->AHB2ENR |= RCC_AHB2ENR_GPIOBEN;
// 配置GPIOB8和GPIOB9为复用模式
GPIOB->MODER &= ~(GPIO_MODER_MODE8_Msk | GPIO_MODER_MODE9_Msk);
GPIOB->MODER |= (GPIO_MODER_MODE8_1 | GPIO_MODER_MODE9_1);
// 配置GPIOB8和GPIOB9的输出类型为开漏
GPIOB->OTYPER |= (GPIO_OTYPER_OT8 | GPIO_OTYPER_OT9);
// 配置GPIOB8和GPIOB9的输出速度为中等速度
GPIOB->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEED8_Msk | GPIO_OSPEEDR_OSPEED9_Msk);
GPIOB->OSPEEDR |= (GPIO_OSPEEDR_OSPEED8_1 | GPIO_OSPEEDR_OSPEED9_1);
// 配置GPIOB8和GPIOB9的上拉电阻使能
GPIOB->PUPDR &= ~(GPIO_PUPDR_PUPD8_Msk | GPIO_PUPDR_PUPD9_Msk);
GPIOB->PUPDR |= (GPIO_PUPDR_PUPD8_0 | GPIO_PUPDR_PUPD9_0);
// 使能I2C1时钟
RCC->APB1ENR1 |= RCC_APB1ENR1_I2C1EN;
// 配置I2C1的时钟频率为100kHz
I2C1->TIMINGR = 0x20303E5D;
// 配置I2C1为从机模式
I2C1->OAR1 = (SLAVE_ADDRESS << 1) | 0x01;
// 使能I2C1的接收中断
I2C1->CR1 |= I2C_CR1_RXIE;
// 使能I2C1的事件中断和错误中断
NVIC_EnableIRQ(I2C1_EV_IRQn);
NVIC_EnableIRQ(I2C1_ER_IRQn);
// 使能I2C1
I2C1->CR1 |= I2C_CR1_PE;
}
void I2C1_EV_IRQHandler(void)
{
// 处理I2C事件中断
if (I2C1->ISR & I2C_ISR_RXNE) {
// 接收到数据
uint8_t data = I2C1->RXDR;
// 处理接收到的数据
// ...
// 清除接收中断标志
I2C1->ICR |= I2C_ICR_RXNECF;
}
}
void I2C1_ER_IRQHandler(void)
{
// 处理I2C错误中断
// ...
}
```
该代码配置了STM32L4的GPIOB8和GPIOB9为I2C1的SDA和SCL引脚,并将I2C1配置为从机模式。在接收到数据时,会触发I2C事件中断,并处理接收到的数据。在出现错误时,会触发I2C错误中断,并进行相应的错误处理。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)