当前位置: 首页 > news >正文

stm32之31.iic

iic双线制。一根是SCL,作为时钟同步线;一根是SDA,作为数据传输线
SDN 

#include "iic.h"#define SCL    PBout(8)#define SDA_W  PBout(9)
#define SDA_R  PBin(9)void IIC_GPIOInit(void)
{GPIO_InitTypeDef GPIO_InitStructure;//使能时钟GRCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//3、配置PG9GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd =GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 ;GPIO_Init(GPIOB, &GPIO_InitStructure);
}static void __IIC_SDAMode( GPIOMode_TypeDef GPIO_Mode)
{GPIO_InitTypeDef GPIO_InitStructure;//使能时钟GRCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//3、配置PG9GPIO_InitStructure.GPIO_Mode = GPIO_Mode;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd =GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 ;GPIO_Init(GPIOB, &GPIO_InitStructure);}//1、主机发送启动信号操作
//启动信号:在SCL的高电平期间,SDA产生下降沿
void IIC_Start(void)
{//设置SDA引脚为输出模式__IIC_SDAMode(GPIO_Mode_OUT);//先保持一段时间空闲>=4usSCL = 1;SDA_W = 1;delay_us(5);//开始启动信号SDA_W = 0;//下降沿delay_us(5);SCL   = 0;//保证启动信号后面函数能顺畅的接上
}//2、主机发送停止信号操作
//停止信号:在SCL的高电平期间,SDA产生上升沿
void IIC_Stop(void)
{//SDA设置为输出模式__IIC_SDAMode(GPIO_Mode_OUT);SDA_W = 0;SCL   = 0;delay_us(5);SCL = 1;//先拉高  --- 高电平期间delay_us(5);SDA_W = 1;//产生上升沿
}//3、主机给从机发送8个数据位
void IIC_WriteByte(unsigned char WData)
{//SDA设置为输出模式__IIC_SDAMode(GPIO_Mode_OUT);for(int i=0;i<8;i++){SCL = 0;delay_us(2);SDA_W = (WData>>(7-i)) & 0x01;delay_us(3);SCL = 1;delay_us(5);}SCL = 0;
}//4、主机读取从机发送过来8个数据位
void IIC_ReadByte(unsigned char *RData)
{unsigned char TemData=0;//临时存放读取的8bit数据//SDA设置为输入模式__IIC_SDAMode(GPIO_Mode_IN);for(int i=0;i<8;i++){SCL = 0;delay_us(5);//SCL低电平期间是给从机发送数据位的时间SCL = 1;delay_us(2);if(SDA_R){//数字1TemData |= 0x80>>i; //1000 0000}delay_us(3);//高电平期间主机可以判断SDA_R读取}SCL = 0;*RData = TemData;//将读到的结果存放到外面的容器中}//5、主机读取从机发送过来1个应答位
//返回读到的应答位 0---有应答  1-----无应答
char IIC_ReadAck(void)
{char Ack=1;//SDA设置为输入模式__IIC_SDAMode(GPIO_Mode_IN);SCL = 0;delay_us(5);//低电平期间给从机发送应答信号的时间SCL = 1;delay_us(2);//高电平期间给主机读取数据位的时间Ack = SDA_R;delay_us(3);SCL = 0;return Ack;//返回读取到的应答结果 外面做判断处理
}//6、主机发送给从机1个应答位
//主机调用这个函数可以传参自己决定是发有应答还是无
void IIC_WriteAck(char Ack)
{//SDA设置为输出模式__IIC_SDAMode(GPIO_Mode_OUT);SCL = 0;delay_us(2);SDA_W = Ack;delay_us(3);SCL = 1;delay_us(5);SCL = 0;
}
http://www.lryc.cn/news/164864.html

相关文章:

  • 新的 ChatGPT 提示工程技术:程序模拟
  • 【Python】爬虫基础
  • leetcode分类刷题:队列(Queue)(三、优先队列用于归并排序)
  • 无线窨井水位监测仪|排水管网智慧窨井液位计安装案例
  • 024 - STM32学习笔记 - 液晶屏控制(一) - LTDC与DMA2D初始
  • Python数据容器:dict(字典、映射)
  • 2023年基因编辑行业研究报告
  • Spring MVC:请求转发与请求重定向
  • 按键灯待机2秒后灭掉
  • SpringBoot通过自定义注解实现日志打印
  • 代码随想录算法训练营第七天 |151.翻转字符串里的单词
  • 【WebRTC---源码篇】(十:一)WEBRTC 发送视频RTP包
  • cmd 90 validate error!(达梦数据库日志报错)
  • Shape Completion Enabled Robotic Grasping
  • 【C++】构造函数意义 ( 构造函数显式调用与隐式调用 | 构造函数替代方案 - 初始化函数 | 初始化函数缺陷 | 默认构造函数 )
  • VMware16安装ghost版win7
  • 项目集成swagger,访问不到swagger页面
  • 微信小程序怎么隐藏顶部导航栏(navigationBar)变透明的解决方案
  • RabbitMQ基础概念-02
  • 从构建者到设计者的低代码之路
  • Linux创建进程 及父子进程虚拟空间 多进程GDB调试
  • uni-app 之 表格设置
  • Linux易混淆知识点
  • 移植FlashDB、SFUD到STM32f407
  • 【算法基础】时间复杂度和空间复杂度
  • 解决微信小程序不支持TextEncoder/TextDecoder对象
  • Qt下SVG格式图片应用
  • python异常处理
  • go get命令不再具有安装功能
  • 合宙Air724UG LuatOS-Air lvgl7-lvgl(矢量字体)