OpenEdv-开源电子网

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

求一个i2c模拟从机的例程.

[复制链接]

10

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
203
金钱
203
注册时间
2018-6-13
在线时间
27 小时
发表于 2022-1-15 10:43:14 | 显示全部楼层 |阅读模式
5金钱
求一个i2c模拟从机的例程,最好在RTOS下运行的,不是也可以,项目要求需要stm32模拟某款eeprom通过SMBus上报的。有大神有这类的可以分享下吗。类似的就行,学习下思路。

最佳答案

查看完整内容[请看2#楼]

模拟???硬件的可以http://www.openedv.com/forum.php?mod=viewthread&tid=230248&extra=
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2022-1-15 10:43:15 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2022-1-16 00:30:07 | 显示全部楼层
木有,帮顶
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2022-1-17 01:00:18 | 显示全部楼层
八度空间 发表于 2022-1-16 14:31
模拟???硬件的可以http://www.openedv.com/forum.php?mod=viewthread&tid=230248&extra=

深圳疫情还好吧?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

10

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
203
金钱
203
注册时间
2018-6-13
在线时间
27 小时
 楼主| 发表于 2022-1-24 11:01:58 | 显示全部楼层
本帖最后由 opsd999 于 2022-1-25 08:54 编辑

感谢,但是这里我遇到个问题,出现在主机来读数据的时候,按照您的例程,我的理解是每次发送数据会进入TXIS发送中断状态寄存器,然后在TXIS的中断中将需要发送的数据填充到TXDR寄存器,但我用F301k8测试发现他和我想的不一样,我发送的是{0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA}依次发送,但实际跑下来第一个数据像是没有发送直接变成了0xFF全是高电平,后续正常。然后我加入了错误中断测试,发现在第一次发送的时候出现了OVR的溢出中断,不知道是什么原因,能麻烦您帮忙看下吗 微信截图_20220124105849.png 微信截图_20220124102928.png f301smbusslavell.zip (14.07 MB, 下载次数: 1)
微信截图_20220124102956.png
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2022-1-25 21:13:31 | 显示全部楼层

还好,放松了很多,我这里又不是高风险地区
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

10

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
203
金钱
203
注册时间
2018-6-13
在线时间
27 小时
 楼主| 发表于 2022-1-26 11:10:22 | 显示全部楼层
八度空间 发表于 2022-1-16 14:31
模拟???硬件的可以http://www.openedv.com/forum.php?mod=viewthread&tid=230248&extra=

感谢您的例程,就是遇到一个第一次read会发生一次OVR错误中断的问题,后面在http://blog.chinaunix.net/uid-30016330-id-5039852.html 这个博文中看到一条,b.发送模式,数据必须再SCL脉冲前进行写I2C_TXDR操作,否则会引起I2C_ISR的OVR置位且产生中断(I2C_CR1的ERRIE使能情况下);同样引起OVR置位的有当STOPF置位(尚未清楚)时启动第1个数据发送;因此需要清楚STOPF位


最后只好改成,从ADDR中断就开始往TXDR塞第一个数据了。
微信截图_20220124102928.png 微信截图_20220124105849.png

回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2022-1-27 21:07:35 | 显示全部楼层
opsd999 发表于 2022-1-26 11:10
感谢您的例程,就是遇到一个第一次read会发生一次OVR错误中断的问题,后面在http://blog.chinaunix.net/u ...
  1. if ((i2c_dev.I2C_EventStatus & I2C_ISR_ADDR) != 0)
  2.         {
  3.                 /*!< ************************************ */
  4.                 /*!<          Enable Nostretch            */
  5.                 /*!< ************************************ */
  6.                 #if I2C_NOSTRETCH_EN
  7.                 {
  8.                         if ((I2C_DEVICE->ISR & I2C_ISR_DIR) != 0)  /*!< Slave enter transmitter mode, Host read data */
  9.                         {
  10.                                 I2C_DEVICE->ISR |= I2C_ISR_TXE;  /*!< set TXE bit */
  11.                                 i2c_dev.I2C_DeviceFlag |= I2C_DEVICE_FLAG_DIR_SEND;
  12.                         }
  13.                         else  /*!< Host write data (slave receive data from host) */
  14.                         {
  15.                                 i2c_dev.I2C_DeviceFlag &= ~I2C_DEVICE_FLAG_DIR_SEND;
  16.                         }
  17.                 }
  18.                 /*!< ************************************ */
  19.                 /*!<          Disable Nostretch           */
  20.                 /*!< ************************************ */
  21.                 #else
  22.                 {
  23.                         if ((I2C_DEVICE->ISR & I2C_ISR_DIR) != 0)  /*!< Slave enter transmitter mode, Host read data */
  24.                         {
  25.                                 i2c_dev.I2C_DeviceFlag |= I2C_DEVICE_FLAG_DIR_SEND;
  26.                                 I2C_DEVICE->ISR |= I2C_ISR_TXE;  /*!< set TXE bit, I2C_TXDR empty */
  27.                                 //
  28.                                 //根据不同寄存器地址来填充data1
  29.                                 //
  30.                                 if (I2C_DEVICE_REGADDRESS == I2C_REG_TEST_ADD)
  31.                                 {
  32.                                         if (I2C_DEVICE_REGOFFSET < I2C_REG_TEST_SIZE)
  33.                                         {
  34.                                                 I2C_DEVICE->TXDR = I2C_REG_TEST[I2C_DEVICE_REGOFFSET];
  35.                                                 I2C_DEVICE_REGOFFSET++;
  36.                                         }
  37.                                         else
  38.                                         {
  39.                                                 I2C_DEVICE->TXDR = I2C_DEVICE_DR_NULL_S;
  40.                                         }
  41.                                 }
  42.                                 else
  43.                                 {
  44.                                         I2C_DEVICE->TXDR = I2C_DEVICE_DR_NULL_R;
  45.                                 }
  46.                         }
  47.                         else  //Receiver mode
  48.                         {
  49.                                 i2c_dev.I2C_DeviceFlag &= ~I2C_DEVICE_FLAG_DIR_SEND;
  50.                         }
  51.                 }
  52.                 #endif
  53.                 I2C_ClearITPendingBit(I2C1, I2C_IT_ADDR);  /*!< set ADDRCF */
  54.         }
复制代码
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 23:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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