I2C 主从模式切换 总结 IPMB

 

项目健康管理模块IPMB,针对协议要求对I2C总结上的节点设备,每一个可以作为主设备去访问从设备的信息。

 

作为发起者,上电启动后主节点为主模式,发起请求消息;从节点在接收到主节点发送的请求消息后,主节点转换为从模式,从节点转换为主模式。从节点发送消息到目的节点,完成通信过程。

 

此协议遵循SMBUS协议。

 

项目基于stm32 设计完成IPMB健康管理,关键点在于主从模式的切换,首先要挂接中断,当为主模式时,关接收中断;当为从模式时打开中断。代码实现如下所示:

I2C配置实现:

void I2C1_Configuration(void)
{
  I2C_InitTypeDef I2C_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    I2C_DeInit(I2C1);
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_InitStructure.I2C_OwnAddress1 = I2C1_Slave_Address;                           //�ӻ���ַ
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStructure.I2C_AcknowledgedAddress= I2C_AcknowledgedAddress_7bit;
    I2C_InitStructure.I2C_ClockSpeed = 100000;
    I2C_Init(I2C1, &I2C_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_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                 //�����ȼ�
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  I2C_ITConfig(I2C1, I2C_IT_BUF | I2C_IT_EVT |I2C_IT_ERR, ENABLE);   //ʹ���ж�
  I2C_Cmd(I2C1, ENABLE);                                             //ʹ��I2C
}

中断函数实现:

void I2C1_EV_IRQHandler(void)
{

  __IO uint32_t SR1Register =0;
  __IO uint32_t SR2Register =0;

  Recvmark = 1;

  SR1Register = I2C1->SR1;
  SR2Register = I2C1->SR2;
	
  /* I2C1�Ǵӻ�(MSL = 0) */
  if((SR2Register &0x0001) != 0x0001)
  {
    /* �����ѷ�����ַ(ADDR = 1: EV1) */
    if((SR1Register & 0x0002) == 0x0002)
    {
      /* �����־��׼���������� */
      SR1Register = 0;
      SR2Register = 0;
			
	  Rx_Idx_IIC1=0;
	  Tx_Idx_IIC1=0;
    }
		
    /* ��������(RXNE = 1: EV2) */
    if((SR1Register & 0x0040) == 0x0040)
    {
      Buffer_Rx_IIC1[Rx_Idx_IIC1++] = I2C1->DR;
      SR1Register = 0;
      SR2Register = 0;
    }
    /* ��⵽ֹͣ����(STOPF =1: EV4) */
    if(( SR1Register & 0x0010) == 0x0010)
    {
      I2C1->CR1 |= 0x0001;
      SR1Register = 0;
      SR2Register = 0;
      Flag_RcvOK_IIC1 = 1; 			
    }
		
	/* ��������(TxE = 1: EV3) */
    if((SR1Register & 0x0080) == 0x0080)
    {
	  I2C1->DR = Response_Message[Tx_Idx_IIC1++];	
      SR1Register = 0;
      SR2Register = 0;
    }
    /* ��⵽��Ӧ��(AF =1: EV3-2) */
    if(( SR1Register & 0x0400) == 0x0400)
    {
			I2C1->SR1 &= 0xFDFF;
      SR1Register = 0;
      SR2Register = 0;		
    }		
  }
	
}

 

开关中断操作:主发送之前关闭中断,从接收时打开中断。

I2C_ITConfig(I2C1, I2C_IT_BUF | I2C_IT_EVT |I2C_IT_ERR, ENABLE);  //使能中断

I2C_ITConfig(I2C1, I2C_IT_BUF | I2C_IT_EVT |I2C_IT_ERR, DISABLE); //关闭中断

一般设计中,对于总线主模式,数据发送为抢占总线的操作,主模式在执行完总线发送需求后自动切换为从模式。

I2C允许多主站模式,数据发送采用总线竞争发送。

智能网联汽车的安全员高级考试涉及多个方面的专业知识,包括但不限于自动驾驶技术原理、车辆传感器融合、网络安全防护以及法律法规等内容。以下是针对该主题的一些核心知识点解析: ### 关于智能网联车安全员高级考试的核心内容 #### 1. 自动驾驶分级标准 国际自动机工程师学会(SAE International)定义了六个级别的自动驾驶等级,从L0到L5[^1]。其中,L3及以上级别需要安全员具备更高的应急处理能力。 #### 2. 车辆感知系统的组成与功能 智能网联车通常配备多种传感器,如激光雷达、毫米波雷达、摄像头和超声波传感器等。这些设备协同工作以实现环境感知、障碍物检测等功能[^2]。 #### 3. 数据通信与网络安全 智能网联车依赖V2X(Vehicle-to-Everything)技术进行数据交换,在此过程中需防范潜在的网络攻击风险,例如中间人攻击或恶意软件入侵[^3]。 #### 4. 法律法规要求 不同国家和地区对于无人驾驶测试及运营有着严格的规定,考生应熟悉当地交通法典中有关自动化驾驶部分的具体条款[^4]。 ```python # 示例代码:模拟简单决策逻辑 def decide_action(sensor_data): if sensor_data['obstacle'] and not sensor_data['emergency']: return 'slow_down' elif sensor_data['pedestrian_crossing']: return 'stop_and_yield' else: return 'continue_driving' example_input = {'obstacle': True, 'emergency': False, 'pedestrian_crossing': False} action = decide_action(example_input) print(f"Action to take: {action}") ``` 需要注意的是,“橙点同学”作为特定平台上的学习资源名称,并不提供官方认证的标准答案集;建议通过正规渠道获取教材并参加培训课程来准备此类资格认证考试。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值