打印
[STM32F1]

STM32F105 IIC作为从机疑问

[复制链接]
2566|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
putron09|  楼主 | 2017-9-25 09:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问大神门,STM32F105的硬件IIC接口能不能用作从机?  
如果可以的话,具体的IIC初始化跟作为主机有什么不同
沙发
feelhyq| | 2017-9-25 10:56 | 只看该作者
必须可以

使用特权

评论回复
板凳
putron09|  楼主 | 2017-9-25 16:25 | 只看该作者
楼上大神,能否将这个IIC从机代码部分共享一下,非常感谢

使用特权

评论回复
地板
feelhyq| | 2017-9-25 16:41 | 只看该作者
给你提供个思路吧,寄存器配置和I2C 作为主差不多的,区别就是要把I2C配置成从模式,另外在I2C作为从模式,要设置从机的地址。

使用特权

评论回复
5
feelhyq| | 2017-9-25 16:42 | 只看该作者
本帖最后由 feelhyq 于 2017-9-25 16:50 编辑

如果从机是为了发送数据的话,建议使用DMA+I2C模式,因为不知要主机什么时候读取数据,因此要提前准备好数据(DMA就起了提前准备好数据的作用)
对于I2C SPI这种需要同步时钟通信的接口,作为从机的话,时钟必须有主机提供,以帮助从机把数据从数据寄存器里面“推出去"

使用特权

评论回复
评分
参与人数 1威望 +5 收起 理由
caijie001 + 5 赞一个!
6
feelhyq| | 2017-9-25 16:43 | 只看该作者
如果从机是为了接收数据,那就用中断接收的方式更合理一点。

使用特权

评论回复
7
feelhyq| | 2017-9-25 16:52 | 只看该作者
代码看看,遇到的问题说明清楚,越详细越好,最重要的是用示波器波形 上来

使用特权

评论回复
8
putron09|  楼主 | 2017-9-25 17:09 | 只看该作者
好的,非常感谢,我先理一理

使用特权

评论回复
9
putron09|  楼主 | 2017-9-25 17:18 | 只看该作者
1:我这边作为IIC从机,另个一个模块作为主机,需要对我写数据(作为命令让我执行某些动作),并且也需要查询某些状态(也就是我需要准备一些数据供主机读)
2:我不明白你说的从机接收数据以及从机发送数据; IIC所有动动作不管是读还是写不都是主机发起的吗,主机读取从机的数据,这个时候从机仅仅是按照协议节拍,在合理的时候在寄存器的对应的buff处准备好数据,供主机读取吧?

使用特权

评论回复
10
putron09|  楼主 | 2017-9-25 17:19 | 只看该作者
我的IIC配置如下
static void MX_I2C2_Init(void)
{
    /*I2C_Info.controlMode=1;//硬件控制
        I2C_Info.speed=400000;
        I2C_Info.subAddrMode=2;
        I2C_Info.subAddrWidth=0;
        I2C_Info.slaveAddr=0x30;
        I2C_Info.channel=1;
        VT_I2C_HardInit(&I2C_Info);*/
  hi2c2.Instance = I2C2;
  hi2c2.Init.ClockSpeed = 100000;
  hi2c2.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c2.Init.OwnAddress1 = 0x2a;//0x54
  hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c2.Init.OwnAddress2 = 0;
  hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_ENABLE;
  if (HAL_I2C_Init(&hi2c2) != HAL_OK)
  {
    Error_Handler();
  }

}

使用特权

评论回复
11
feelhyq| | 2017-9-25 17:26 | 只看该作者
putron09 发表于 2017-9-25 17:19
我的IIC配置如下
static void MX_I2C2_Init(void)
{

看样子你用的是hal库,直接拿hal库的配置,都不用自己配啦

使用特权

评论回复
12
putron09|  楼主 | 2017-9-25 17:28 | 只看该作者
恩,但是进步了中断

使用特权

评论回复
13
putron09|  楼主 | 2017-9-25 17:29 | 只看该作者

1:我这边作为IIC从机,另个一个模块作为主机,需要对我写数据(作为命令让我执行某些动作),并且也需要查询某些状态(也就是我需要准备一些数据供主机读)
2:我不明白你说的从机接收数据以及从机发送数据; IIC所有动动作不管是读还是写不都是主机发起的吗,主机读取从机的数据,这个时候从机仅仅是按照协议节拍,在合理的时候在寄存器的对应的buff处准备好数据,供主机读取吧?

这个是我不理解的地方,怎么从机还有接收和发送的说法?

使用特权

评论回复
14
putron09|  楼主 | 2017-9-25 17:30 | 只看该作者
能否把你的IIC从机的配置贴上来,我对比下,看到底哪里导致进步了中断

使用特权

评论回复
15
feelhyq| | 2017-9-25 17:35 | 只看该作者
putron09 发表于 2017-9-25 17:30
能否把你的IIC从机的配置贴上来,我对比下,看到底哪里导致进步了中断

去年写的,都不知道扔哪里去了。如果实在不会调,用SPI或者UART通信都可以

使用特权

评论回复
16
putron09|  楼主 | 2017-9-25 17:41 | 只看该作者
恩,不过接口是定制的,只能用IIC了,我再研究一下,谢谢feelhyq了

使用特权

评论回复
17
zjlol| | 2017-9-26 09:13 | 只看该作者
学习了,谢谢

使用特权

评论回复
18
putron09|  楼主 | 2017-9-26 14:57 | 只看该作者
可以进入中断了,但是上电之后一定要执行HAL_I2C_Slave_Receive(),就运行一下就行,然后才能正常IIC通信
不知道是啥情况????

使用特权

评论回复
19
Stannis| | 2017-9-26 18:30 | 只看该作者
从机时钟必须有主机提供

使用特权

评论回复
20
feelhyq| | 2017-9-27 15:19 | 只看该作者
楼主问题解决了吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

172

帖子

2

粉丝