stm32 硬件iic从机程序
时间: 2023-10-04 21:05:58 浏览: 73
以下是STM32硬件I2C从机程序示例:
```
#include "stm32f10x.h"
#define SLAVE_ADDRESS 0x50
uint8_t rxBuffer[10];
uint8_t txBuffer[10] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A};
uint8_t txIndex = 0;
uint8_t rxIndex = 0;
void I2C1_EV_IRQHandler(void)
{
if(I2C_GetITStatus(I2C1, I2C_IT_EVT) == SET)
{
switch(I2C_GetLastEvent(I2C1))
{
case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED:
rxIndex = 0;
break;
case I2C_EVENT_SLAVE_BYTE_RECEIVED:
rxBuffer[rxIndex++] = I2C_ReceiveData(I2C1);
break;
case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED:
txIndex = 0;
I2C_SendData(I2C1, txBuffer[txIndex++]);
break;
case I2C_EVENT_SLAVE_BYTE_TRANSMITTED:
if(txIndex < 10)
{
I2C_SendData(I2C1, txBuffer[txIndex++]);
}
break;
default:
break;
}
I2C_ClearITPendingBit(I2C1, I2C_IT_EVT);
}
}
void I2C1_ER_IRQHandler(void)
{
if(I2C_GetITStatus(I2C1, I2C_IT_ERR) == SET)
{
I2C_ClearITPendingBit(I2C1, I2C_IT_ERR);
}
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = I2C1_ER_IRQn;
NVIC_Init(&NVIC_InitStructure);
I2C_DeInit(I2C1);
I2C_InitStructure.I2C_Mode = I2C_Mode_SMBusHost;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = SLAVE_ADDRESS << 1;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 100000;
I2C_Init(I2C1, &I2C_InitStructure);
I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_ERR, ENABLE);
I2C_Cmd(I2C1, ENABLE);
while(1);
return 0;
}
```
在这个示例中,从机设备的地址为0x50。当主机设备向从机设备发送数据时,从机设备会将接收到的数据存储在rxBuffer数组中。当主机设备从从机设备读取数据时,从机设备会将txBuffer数组中的数据发送给主机设备。在中断处理程序中,根据I2C事件的类型,从机设备会执行相应的操作。在主函数中,启用I2C外设并开启中断功能。在while循环中,程序会一直等待中断事件的发生。