pt电子游戏正网开户游戏: [其他] 【芯圣SDK-HC89F0541测评】+24C02(硬件I2C)

江山VR彩票百家乐计划群大全
3345|38
楼主
今天搞了一下AT24C02,硬件I2C
SCL:P0.1;
SDA:P0.0
代码:
  1. #define        ALLOCATE_EXTERN
  2. #include "HC89F0541.h"

  3. #define        DEVICEADD        0xA0                                  //24C02器件地址
  4. #define SCL        P0_1                                           //I2C时钟控制位
  5. #define SDA P0_0                                    //I2C数据传送位

  6. unsigned char guc_Buf = 0;                                //用于存放读写数据
  7. unsigned char guc_Buf1 = 0;                                //用于存放读写数据
  8. unsigned char guc_Buf2 = 0;                                //用于存放读写数据
  9. void Delay_ms(unsigned int fui_i);                        //延时函数
  10. void IIC_Send_Byte(unsigned char fuc_Add,unsigned char fuc_Dat);//IIC发送一个字节的数据
  11. unsigned char IIC_Read_Byte(unsigned char fuc_Add);                                //IIC读取一个字节的数据

  12. /***************************************************************************************
  13.   * @实现效果        对24C02进行读写操作
  14. ***************************************************************************************/
  15. void main()
  16. {
  17. /************************************系统初始化****************************************/
  18.         CLKSWR = 0x51;                                                //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc =16MHz
  19.         CLKDIV = 0x01;                                                //Fosc 1分频得到Fcpu,Fcpu=16MHz
  20. /**********************************IIC配置初始化***************************************/
  21.         P0M1 = 0xC2;                                                //P01设置为推挽输出
  22.   P0M0 = 0xE6;                                                //P03设置为带上拉开漏输出
  23.         SCL_MAP = 0x01;                                                //SCL映射P01口
  24.         SDA_MAP = 0x00;                                                //SDA映射P00口
  25.         IICCON = 0x40;                                                 //启动IIC模块

  26.        
  27.         IIC_Send_Byte(0x00,0x66);        //将fuc_Buf的数据写入地址0x00
  28.         Delay_ms(20);       
  29.   IIC_Send_Byte(0x01,0x88);        //将fuc_Buf的数据写入地址0x00
  30.         Delay_ms(20);
  31.         IIC_Send_Byte(0x02,0x13);        //将fuc_Buf的数据写入地址0x00
  32.         Delay_ms(20);       
  33.         guc_Buf = IIC_Read_Byte(0x01);        //读取地址0x00的数据并写入fuc_Buf       
  34.         guc_Buf1 = IIC_Read_Byte(0x02);        //读取地址0x00的数据并写入fuc_Buf       
  35.         guc_Buf2 = IIC_Read_Byte(0x00);        //读取地址0x00的数据并写入fuc_Buf       
  36.         while(1)
  37.         {
  38.                  
  39.         }
  40. }

  41. /***************************************************************************************
  42.   * @说明          IIC发送一个字节的数据
  43.   *        @参数        fuc_Add:存储的地址
  44.   *                        fuc_Dat:存储的数据
  45.   * @返回值 无
  46.   * @注                无
  47. ***************************************************************************************/
  48. void IIC_Send_Byte(unsigned char fuc_Add,unsigned char fuc_Dat)
  49. {
  50.         IICCON &=~ 0x08;                //清除中断标志位       
  51.         IICCON |= 0x20;                         //起始位发送起始信号
  52.         while((!(IICCON&0x08))&&(IICSTA!=0x08));
  53.         IICCON &=~ 0x20;                //起始位停止起始信号               
  54.         IICCON &=~ 0x08;                //清除中断标志位
  55.         IICDAT = DEVICEADD;                //写入器件地址
  56.         while(IICSTA!=0x18);
  57.         IICCON &=~ 0x08;                //清除中断标志位                               
  58.         IICDAT = fuc_Add;                //写入地址
  59.         while(IICSTA!=0x28);
  60.         IICCON &=~ 0x08;                //清除中断标志位
  61.         IICDAT = fuc_Dat;                //写入数据
  62.         while(IICSTA!=0x28);
  63.         IICCON &=~ 0x08;                //清除中断标志位
  64.         IICCON |= 0x10;                 //停止位发送停止信号
  65. }

  66. /***************************************************************************************
  67.   * @说明          IIC读取一个字节的数据
  68.   *        @参数        fuc_Add:存储的地址
  69.   * @返回值 存储地址里面的数据
  70.   * @注                无
  71. ***************************************************************************************/
  72. unsigned char IIC_Read_Byte(unsigned char fuc_Add)
  73. {
  74.         unsigned char fuc_Dat;
  75.         IICCON &=~ 0x08;                //清除中断标志位                       
  76.         IICCON |= 0x20;                        //起始位发送起始信号
  77.         while((!(IICCON&0x08))&&(IICSTA!=0x08));
  78.         IICCON &=~ 0x20;                //起始位停止起始信号               
  79.         IICCON &=~ 0x08;                //清除中断标志位
  80.         IICDAT = DEVICEADD;                //写入器件地址
  81.         while(IICSTA!=0x18);
  82.         IICCON &=~ 0x08;                //清除中断标志位       
  83.         IICDAT = fuc_Add;                //写入读地址
  84.         while(IICSTA!=0x28);
  85.         IICCON &=~ 0x08;                //清除中断标志位       

  86.         IICCON |= 0x20;                        //起始位发送起始信号
  87.         while((!(IICCON&0x08))&&(IICSTA!=0x08));
  88.         IICCON &=~ 0x20;                //起始位停止起始信号                       
  89.         IICCON &=~ 0x08;                //清除中断标志位               
  90.         IICDAT = DEVICEADD|0x01;//写入读指令
  91.         while(IICSTA!=0x40);       
  92.         IICCON &=~ 0x08;                //清除中断标志位       
  93.         while(IICSTA!=0x58);
  94.         fuc_Dat = IICDAT;                //读入数据
  95.         IICCON &=~ 0x08;                //清除中断标志位       
  96.         IICCON |= 0x10;                        //停止位发送停止信号

  97.         return        fuc_Dat;
  98. }

  99. /**
  100.   * @说明          延时函数
  101.   * @参数          fui_i : 延时时间
  102.   * @返回值 无
  103.   * @注         Fcpu = 16MHz,fui_i = 1时,延时时间约为1Ms
  104.   */
  105. void Delay_ms(unsigned int fui_i)
  106. {
  107.         unsigned int fui_j;
  108.         for(;fui_i > 0;fui_i --)
  109.         for(fui_j = 1596;fui_j > 0;fui_j --);
  110. }
复制代码
效果图:

工程:
IIC-读写24C02.rar (46.36 KB, 下载次数: 4)
沙发
| 2020-7-15 11:40 | 只看该作者
板凳
| 2020-7-15 11:59 | 只看该作者
感觉硬件iic没有优势,也看不出来硬件iic的价值所在
1、软件模拟速度不是太大的问题,不会慢很多
2、使用硬件iic也需要等待每一个字节的状态信息,不会提速,字节的操作时间大约20us,也不适合切换到其他任务去执行,甚至开启中断服务都有点短
3、硬件iic的代码量似乎比软件模拟的还多
4、硬件iic的常用外设很难用dma驱动传输
唯一看上去有价值的是中断驱动模式进行读写,但是状态处理复杂度也有点高
地板
 楼主 | 2020-7-15 14:22 | 只看该作者
wangshujun 发表于 2020-7-15 11:59
感觉硬件iic没有优势,pt电子游戏正网开户游戏:也看不出来硬件iic的价值所在
1、软件模拟速度不是太大的问题,不会慢很多
2、使用硬 ...

我感觉硬件I2C还是要比模拟时序省不少代码的。
5
| 2020-7-15 15:04 | 只看该作者
比神乐 发表于 2020-7-15 14:22
我感觉硬件I2C还是要比模拟时序省不少代码的。

就少了模拟时钟和数据的移位收发,还多了中断标志的判断和处理
感觉更复杂了
6
 楼主 | 2020-7-15 16:40 | 只看该作者
wangshujun 发表于 2020-7-15 15:04
就少了模拟时钟和数据的移位收发,还多了中断标志的判断和处理
感觉更复杂了 ...

有多也有少
7
| 2020-7-16 11:18 | 只看该作者

硬件外设还是要有dma或者使用中断才更有价值

对于1t51,16兆来说:
对于iic和spi来说中断方式也有点尴尬,iic用中断还凑合,但是对于51来说进出中断时间都算上,占比也极高了,大约会占用一半的cpu时间,有价值,但是不算很大
最高速状态的spi字节时间比中断进出时间还小,基本没使用中断的价值了,很可能比查询还慢

对于高主频的mcu,比如100兆的:
在高主频的mcu上iic的中断还是很方便的,节省的等待时间很可观
spi高速模式下,没有dma就很难发挥出价值了
8
| 2020-8-3 16:18 | 只看该作者
硬件I2C就是一个坑   
9
| 2020-8-3 16:18 | 只看该作者
硬件II2C和软件I2C有什么区别
10
| 2020-8-3 16:19 | 只看该作者
芯片已经内置了I2C?  
11
| 2020-8-3 16:19 | 只看该作者
还是模拟I2C时序           
12
| 2020-8-3 16:20 | 只看该作者
硬件I2C 到底怎么样?  
13
| 2020-8-3 16:20 | 只看该作者
哪些 口 可以用作I2C的连线口   
14
| 2020-8-3 16:20 | 只看该作者
              
15
| 2020-8-3 16:21 | 只看该作者
如何设置 硬件 i2c 外设的从设备
16
| 2020-8-3 16:21 | 只看该作者
用起来比较复杂  
17
| 2020-8-3 16:21 | 只看该作者
硬件I2C 到底是不是个坑
18
| 2020-8-3 16:21 | 只看该作者
硬件I2C稳定吗   
19
| 2020-8-3 16:21 | 只看该作者
用普通的IO口模拟I2C功能
20
| 2020-8-3 16:21 | 只看该作者
硬件IIC驱动有吗?   
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

江山VR彩票百家乐计划群大全 永利游戏开户直营 返回顶部 返回列表
五星彩票开户直营网 6762彩票网平台直营网 江山VR彩票百家乐计划群大全 百家乐大小骰宝官方网 中国 赌场 合法登入
天天申博馆开奖记录 澳门赌场AB亚洲馆开奖时刻表 金沙娱乐赌场官网 淘金BBIN波音馆时时彩q群 皇家赌场广东快乐十分时时彩q群
千亿云南时时彩官方网 澳门太阳城福彩3D计划群大全 正大国际VR彩票百家乐走势图 亚洲国际BBIN波音馆走势 智博彩票登陆
ag平台登入网址 三亚美高梅酒店 a0000.com 天天VR六合彩官网 澳门葡京真人厅