你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F412 I2C从模式 HAL库使用方法疑问

[复制链接]
赤心木 提问时间:2019-4-23 09:24 /
本帖最后由 chixinmu-184972 于 2019-4-23 09:24 编辑

    最近在做一个类似I2C hub的开发,需要一个I2C做从机,4个I2C做主机转发从机接收到的内容,选用了STM32F412这颗料,包含四路硬件I2C,打算再用一路软件模拟I2C实现功能。使用官方的CubeMx生成代码调试。目前在调试I2C从机通讯,调试过程中有一些疑问,特向大家请教:    I2C通讯中最基本的两个传输函数是HAL_I2C_Slave_Receive_IT()/HAL_I2C_Slave_Transmit_IT(),但是这两个函数只能够发送或者接受特定长度的数据,而作为I2C从机,当主机写操作的时候,数据的长度是不定的,如何使用HAL库实现I2C从机不定长数据的接收呢?
    另外,注意到I2C还可以时序操作(还不是很理解时序操作能够实现什么功能)以及地址监听。地址监听在识别到正确地址后会有一个CallBack。我在这个CallBack中做了一些标志位置位。疑问是否可以在CallBack中调I2C 读写操作?
  1. void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode)
  2. {
  3.   if(hi2c->Instance==I2C1)
  4.   {
  5.     g_Add_ack_flag = 1;
  6.     if(TransferDirection == I2C_DIRECTION_RECEIVE)
  7.     {
  8.       g_trans_flag = 1;
  9.       HAL_I2C_Slave_Seq_Receive_IT(&hi2c1, g_I2c_R_buffer, 10, I2C_NEXT_FRAME);
  10.     }
  11.     else if (TransferDirection == I2C_DIRECTION_TRANSMIT)
  12.     {
  13.       g_trans_flag = 2;
  14.     }
  15.     else
  16.     {
  17.       g_trans_flag = 0;
  18.     }
  19.   }
  20. }
复制代码
   另外,在时序操作函数中,有一些特殊的帧标志,这些帧标志是做什么用的,时序操作函数是作用在什么时候? 微信截图_20190423092110.png
   还请大家指教。





收藏 评论1 发布时间:2019-4-23 09:24

举报

1个回答
Kevin_G 回答时间:2019-4-23 10:08:08
HAL_I2C_Slave_Receive_IT() 是每次接收特定长度数据后产生中断,处理后然后关闭中断。你可以将长度设置为1,每接收一个字节就进一次中断,然后重新开启接收。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版