OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3974|回复: 1

STM32 HAL库 硬件 I2C Slave

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-5-25
在线时间
0 小时
发表于 2018-5-25 11:35:48 | 显示全部楼层 |阅读模式
1金钱
[mw_shl_code=applescript,true]void I2C_Slave_Achieve(void)
{
        //初始化数据变量的数量
        hTxNumData = 0;
        hRxNumData = 0;
        BSP_LED_On(LED3);  //亮灯
               
                  //从机接收来自主机的请求
//    HAL_I2C_Slave_Receive_IT里的三个参数:
//                @param hi2c:指向包含指定I2C的配置信息的I2C_HandleTypeDef结构的指针。
//    @param pData:指向数据缓冲区的指针
//    @param Size:要发送的数据量
        while(HAL_I2C_Slave_Receive_IT(&I2CxHandle, (uint8_t*)&bTransferRequest, 1)!= HAL_OK)
        {
                BSP_LED_Off(LED3);     //=======我都还没请求数据,程序好像也不会进来这里灭灯
        }
       
        /*在开始新的通信传输之前,需要检查外设的当前状态;
        如果它很忙,则需要等待当前传输的结束才能启动新传输。
        为简单起见,此示例仅等待传输结束
        但应用程序可能在传输操作正在进行时执行其他任务。*/
        while(HAL_I2C_GetState(&I2CxHandle) != HAL_I2C_STATE_READY)
        {
        }
       
        //主机请求读操作
        //从机接收要写入的数据的数量
        while(HAL_I2C_Slave_Receive_IT(&I2CxHandle, (uint8_t*)&hTxNumData, 2)!= HAL_OK);
       
        //忙等待
        while(HAL_I2C_GetState(&I2CxHandle) != HAL_I2C_STATE_READY)
        {
        }
       
        //从机将aTxBuffer发送给主机
        while(HAL_I2C_Slave_Transmit_IT(&I2CxHandle, (uint8_t*)aTxBuffer, RXBUFFERSIZE)!= HAL_OK);
       
        while(HAL_I2C_GetState(&I2CxHandle) != HAL_I2C_STATE_READY)
        {
        }

       
       
       
       
}[/mw_shl_code]
设计的STM32L053作为I2C从机,当其他主机请求时,判断所请求的寄存器地址,再发送相应的数据个主机。
参考的是官方的例程,有个疑问,就是为什么从机响应时,没有判断寄存器地址呢?那这样我该如何判断所请求的是哪个数据呢?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-5-27 01:23:39 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 10:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表