STM8S105K4T6硬件IIC调试小结

2023-10-27

1.IIC初始化

具体时钟设置参考此篇文章:https://blog.csdn.net/u014397533/article/details/46495905

 

void I2C_Init(void)
{
      I2C_CR1    = 0x00; //禁止I2C外设,此句可省略
      //CLK_PCKENR1 |= 0x01;    //使能IIC外设时钟,可省略,因为上电默认开启所有时钟
      I2C_FREQR|= 0x10; //输入时钟频率16M,对应系统时钟频率
      I2C_CCRH=0x00;
      I2C_CCRL=0x50; //16M / 100K / 2 
      I2C_TRISER=0x11;//0x10 + 1
     
      //I2C_CR1  = 0x00; //禁止I2C外设  
      
      I2C_OARH = 0x40;    //七位地址模式
      I2C_OARL = 0xa0;//自身地址0xa0
      
     
      //I2C_start();//发起始位 
      I2C_CR2   |= 0x04;//应答使能
      //I2C_CR2_POS=0;//I2C->CR2&=~(0x08);    //POS=0    这一位的设置很关键,它确定I2C主机返回的NACK在当前字节传输后起作用,而从机只有在收到NACK信号后才能释放总线;
      I2C_CR1|= 0x01; //开启I2C外设 
}

2.Optionbyte选项字节配置

因PB4/PB5默认是AD转换功能,需要配置选项字节,如果未配置会导致卡在Start condition检测,

while(I2C_SBask==0);///检测起始位是否发完

IAR配置方法:

 

AFR6配置为Active即可

也可将配置文件存下,然后在项目属性里添加该文件,实测不添加也可以

没有其他问题的话就可以通信成功了

void I2C_Start(void)
{
      I2C_busy();//测忙
      I2C_start();//发起始位
      while(I2C_SBask==0);///检测起始位是否发完
}

void I2C_SendDAdr(u8 Add)
{
      
      I2C_writebyte(Add);//数据写入寄存器	
      while(I2C_addrask==0);//当收到地址的ACK后该位被置’1’。
      I2C_busy();//测忙
}

void I2C_SendDat(u8 data)
{
      I2C_writebyte(data);
      I2C_busy();
      while(I2C_TxEask==0);//1:数据寄存器空;
}

u8 I2C_RcvDat(void)
{
      u8 i;
      while(I2C_RxNeask==0);
      abc:
      if(I2C_BTF==0x04)
      {i=I2C_DR;}
      else goto abc;
      if(I2C_BTF==0)
      {}
      else goto abc;
      return i;
}

//--------------------------------------------------------------
// Prototype      : void Write_24c02(uchar wdata)
// Calls          : I2C_Start(), I2C_Stop(),I2C_SendByte()
// Parameters     : RegAddr-- target memory address,  
//                  wrdata--- data to be writing
// Description    : Write one byte to target memory
//--------------------------------------------------------------
u8 I2C_Write88(u8 regadd,u8 wdata)
{
                    
  I2C_Start();                      //起始信号
  //Delay_5us();
  //Delay_5us();
  I2C_SendDAdr( SlaveAddress);     //发送设备地址+写信号
  I2C_SendDat(regadd);             //内部寄存器地址,请参考中文pdf22页
  I2C_SendDat(wdata);              //内部寄存器数据,请参考中文pdf22页
  I2C_stop();                       //发送停止信号
  //Delay_5us();                   
 
  return 0;
}

//--------------------------------------------------------------
// Prototype      : uchar Read_24c02(uchar regadd)
// Calls          : I2C_Start(), I2C_Stop(),I2C_SendByte(),I2C_RecvByte(),I2C_SendACK()
// Parameters     : RegAddr-- target memory address,  
// Return Value   : revDAT- received data
// Description    : Read one byte from target memory
//--------------------------------------------------------------
u8 I2C_Read88(u8 regadd)
{
  u8 revdata;
  //CS  = 0;
  //Delay_5us();                   
  
  I2C_Start();                  //起始信号
  I2C_SendDAdr(SlaveAddress);   //发送设备地址+写信号
  I2C_SendDat(regadd);         //发送存储单元地址,从0开始
  
  I2C_Start();                 //起始信号
  I2C_SendDAdr( SlaveAddress+1);    //发送设备地址+读信号   
  
  //I2C_NAck();
  //I2C_stop();                 //停止信号
  revdata = I2C_RcvDat();    //读出寄存器数据
  //I2C_Ack();
  I2C_NAck();//读倒数第二个数据字节之后清除ACK位
  I2C_stop(); //读倒数第二个数据字节之后设置STOP/START位
  
  //Delay_5us();                   
  //CS  = 1;
  
  return revdata;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM8S105K4T6硬件IIC调试小结 的相关文章

  • 百度地图TILE算法

    Creating primary keyvar LLBAND2 75 60 45 30 15 0 var LL2MC2 0015702102444 111320 7020616939 0x60e374c3105a3 0x24bb4115e2

随机推荐

  • Java ArrayList Class

    In this tutorial we will learn about the Java ArrayList class We will learn about different ArrayList operations and met
  • (Jquery功能篇) jquery 插件fancybox查看图片原图

    效果截图 fancybox相关介绍 1 可以支持图片 html文本 flash动画 iframe以及ajax的支持 2 可以自定义播放器的CSS样式 3 可以以组的形式进行播放 4 如果将鼠标滚动插件 mouse wheel plugin
  • ubuntu中.conf 文件的修改与保存

    命令行下输入 sudo vim etc 文件名 conf 进入编辑模式 按 i 键进入编辑模式 此时可以修改文本 按 esc 键 此时退出修改文本 输入 wq 保存退出
  • 自动

    合约地址 https remix ethereum org 代码地址 https pst klgrth io paste ptwko raw 注意 50行代码token值替换成自己的钱包地址 最少要用 3 个BNB 不然是抢不到的 代码 p
  • WPF DataGrid控制DataGridTextColumn的IsReadOnly属性问题

    DataGridTextColumn这个控件不是一个真正的Visual所以IsReadOnly的属性绑定没用 如果绑定为
  • 看完这篇 教你玩转渗透测试靶机Vulnhub——The Planets:Venus

    Vulnhub靶机The Planets Venus渗透测试详解 Vulnhub靶机介绍 Vulnhub靶机下载 Vulnhub靶机安装 Vulnhub靶机漏洞详解 信息收集 SSH登入 CVE 2021 4034漏洞提权 获取FLAG 缓
  • SylixOS电源管理概述以及接口介绍

    1 概述 电源管理是操作系统中重要的一部分 要实现电源管理功能 首先需要设备本身支持电源管理操作 其次是操作系统支持电源管理操作 SylixOS支持电源管理功能 电源管理分为两大部分 CPU功耗管理和外设功耗管理 1 1 CPU功耗管理 S
  • power query 如何实现group_concat功能

    power query 分组合并展示 网上答案 https www cnblogs com wsmwsm p 12910590 html 答案 用powerquery 第一步 从表格进入pq界面 第二步 将kid2name列和id列都转换成
  • redis:redis cluster集群实践

    redis集群参数配置 我们后面会部署一个Redis集群作为例子 在那之前 先介绍一下集群在redis conf中的参数 cluster enabled
  • python编译报错 ImportError: cannot import name ‘jaccard_similarity_score‘

    报错如下 问题代码 import numpy as np from sklearn metrics import jaccard similarity score y pred 0 2 1 3 y true 0 1 2 3 print ja
  • 认识传输层(UDP与TCP)

    传输层主要负责数据能够从发送端发送到接收端 要正确传输就要明确发送端和接收端 这时候IP地址和端口号一起就可以确定一端了 那么他们是怎么唯一标识的呢 1 端口号 port 端口号唯一标识一个主机上进行通信的不同应用程序 在TCP IP协议中
  • flutter Stack超出底图范围后,关闭按键点击效果失效

    既然是关闭按键超出了底图范围导致不能点击 那就让关闭按键不超出就可以了 可以给底图再添加一个大点的底图 这两个底图作为一个整体 关闭按键就可以点击了 如图 下面添加了一个黑色的底图用来扩充原来的底图范围 白色关闭按键就可以点击得到了 ret
  • 计算机硬件耗电,电脑中最耗电的三个硬件排行:这答案意料之外的情理之中!...

    众所周知 只要电脑工作的话就肯定会耗电 那么问题就来了 在电脑中哪个硬件的耗电量是最高的呢 耗电的多少又会有哪些标准进行判断呢 就像笔者的文章中反复强调的 我们既要知道结果但同时还需要知道 为什么 笔者今天就继续用打破砂锅问到底的死磕精神来
  • echarts地图map

    在vue中使用echarts绘制图表 npm install echarts save 全局安装echarts 具体代码及注释如下
  • mac上的matlab的设置工具箱cvx

    cvx的下载地址 http cvxr com cvx download 首先怎么做到在终端运行matlab程序呢 打开终端 vi bash profile 进行配置 加入 export PATH PATH Applications MATL
  • ixp协议服务器,ipx协议中的“内部网络号”是什么意思?

    1 IPX的协议构成 IPX协议簇包括如下主要协议 IPX 第三层协议 用来对通过互联网络的数据包进行路由选择和转发 它指定一个无连接的数据报 相当于TCP IP协议簇中的IP协议 SPX 顺序包交换 Sequenced Packet Ex
  • angular编译版本冲突解决办法总结

    刚刚涉足angular 对于node npm typescript等都不太熟悉 网上下载别人源码一编译 报一堆英文错误 死了的心都有了 先来感受一下吧 经过两天的踩坑 东看看 西查查 终于算是解决了目前项目的错误 虽然不知道为什么 但是可以
  • 三元运算符判断字符串是否为空

    有一个变量String userId 判断是否为null 如果为null 就赋值为空串 否则就不变 用if条件写是 if null userId userId 想用三元运算符写 常见错误写法 userId null userId 这样是错误
  • html禁止自动填充input表单的完美解决办法

    提交登陆等表单时 允许记录了密码则会保存起来 且每次都会自动填充入input 我们有时候不需要自动填充 试过网上的各种方法都没能完美解决 最后终于找到解决办法 废话不多说 直接上代码
  • STM8S105K4T6硬件IIC调试小结

    1 IIC初始化 具体时钟设置参考此篇文章 https blog csdn net u014397533 article details 46495905 void I2C Init void I2C CR1 0x00 禁止I2C外设 此句