STM8L051F3 硬件I2C从机实例--新手导航

发布者:532829319hmk最新更新时间:2020-02-02 来源: eefocus关键字:STM8L051F3  硬件I2C  从机实例  新手导航 手机看文章 扫描二维码
随时随地手机看文章

这是我写的第一篇有关于技术的文章,可能写的不是很好,仅供参考。


先介绍一下背景,我是第一次接触STM的芯片,以前接触过都是基于51的芯片,算是有一点基础吧。因为公司的项目需要用到STM8L051F3的硬件I2C作为从机送数据,把自己从接触到调通遇到的问题记录一下,有需要的可以参考一下。


这篇文章是以相对新手的水平去写给新手参考的,所以我会尽量写的详细点。


1.首先我们需要查看数据手册,看下硬件I2C的接口是哪个端口,我用的是STM8L051F3这一块芯片。

通过手册可以知道,这款芯片的I2C端口为C0跟C1(一开始忘记去查手册,傻呼呼的用别的端口调试了很久。。。)

这款芯片的I2C应该是不能复用别的端口的,反正手册我没查到,只能用C0跟C1。


2.接下来开始初始化I2C需要的设置。(这里我只讲7位地址的。)

void I2C_Init(void)

{

  CLK_PeripheralClockConfig(CLK_Peripheral_I2C1, ENABLE); //初始化I2C时钟

  CLK->SWR=CLK_ICKCR_HSION;//时钟选择为HSI

  CLK->CKDIVR = 0;   //时钟不分频

  CLK->PCKENR1 = 0x08; // 使能I2C时钟

  


/* Init GPIO for I2C use */ //初始化端口C0和C1

GPIOC->CR1 |= 0x03;

GPIOC->DDR &= ~0x03;

GPIOC->CR2 &= ~0x03;


//初始化I2C寄存器

I2C1->CR1 |= 0x01;         // Enable I2C peripheral

I2C1->CR2 = 0x04;       // Enable I2C acknowledgement

I2C1->FREQR = 16;       // Set I2C Freq value (16MHz)

//下面这里要重点说明一下,STM8L051F3的硬件I2C作为从机是可以具备2个地址的。(用不到的话等下不要使能地址2即可)

I2C1->OARL = (0x44<< 1) ; // 地址1 = 0x44.第0位是10位地址的0位,7位地址要左移1位。

I2C1->OARH = 0x40;       // 此位需要置1,看手册。

I2C1->OAR2 = (0x46 << 1)|0x01; //这里是地址2 = 0x46的寄存器,第0位置1是使能2个地址,如果用不到直接屏蔽此语句即可。

I2C1->ITR = 0x07;       // all I2C interrupt enable  使能I2C中断


}


3.记得开启中断(enableInterrupts();),下面看中断内容。

中断里面我们需要2组数组来储存收发的数据,这个自己在主函数里定义2个全局变量数组,大小为你自己想需要收发的数据看有多少了。


#define MAX_Id 10

u8 Slave_Buffer_Tx[MAX_Id];

u8 Slave_Buffer_Rx[MAX_Id];


下面是一个广播地址的

INTERRUPT_HANDLER(I2C_IRQHandler,29)

{

unsigned char Add;

unsigned char Nuse;

static unsigned char RX_Cnt=0;


if(I2C1->SR2&0X0F) //I2C 出现错误

{

I2C1->SR2&=0xf0;

//I2C->CR2|=1<<7;

//I2C->CR2&=~(1<<7);

RX_Cnt=0;

I2C_Tx_Idx=0;

I2C1->SR2 |=0x02;

}


if(I2C1->SR1&0X02) //地址匹配

{

(void)(I2C1->SR3); //先读I2C_SR1,再读I2C_SR3,就可以清除ADDR

// I2C->DR = 0X00;

I2C_Tx_Idx=0;

I2C_Rx_Idx=0;

I2C1->DR = Slave_Buffer_Tx[I2C_Tx_Idx++];

}

if(I2C1->SR1&0X10) //停止条件

{

Nuse = I2C1->CR2; //清除停止位(SR1第4位),先读SR1,再写CR2

nop();

I2C1->CR2 = Nuse;

}

if(I2C1->SR1&0X04) //BTF位,先读SR1,再读或者写DR寄存器清除

{

Nuse=I2C1->DR;

// I2C->DR=Nuse;

}

if(I2C1->SR1 & 0x40) //RXNE,数据寄存器是否为空,0空1非

{

//将收到的数据储存到RX数组中。虽然我们是从机,用不到这里的数据,但是这里必须读DR寄存器收取数据.不然会出错

Slave_Buffer_Rx[I2C_Rx_Idx++]=I2C1->DR;

if(I2C_Rx_Idx>=MAX_Id)

{

I2C_Rx_Idx=0;

}

}

if(I2C1->SR1 & 0x80) //将发送的数据放入DR寄存器,清除TXE

{

I2C1->DR = Slave_Buffer_Tx[I2C_Tx_Idx++];

if(I2C_Tx_Idx>=MAX_Id)I2C_Tx_Idx=0;

}


}


下面是2个广播地址的

//这款芯片的中断文件在这里文件里面(stm8l15x_it.c),I2C的中断向量就是这个。

INTERRUPT_HANDLER(I2C_IRQHandler,29)

{

unsigned char Add;

unsigned char Nuse;

static unsigned char RX_Cnt=0;

B_I2C *base;


if(I2C1->SR2&0X0F) //I2C 出现错误中断的处理。没特别的中断需要处理的话,这里直接复制就好。

{

I2C1->SR2&=0xf0;

RX_Cnt=0;

I2C_Tx_Idx=0;

I2C1->SR2 |=0x02;

}


//第七位判断是从机地址1还是地址2,选择等下接收到的数据要放在哪个结构体里面(或者你们自己替换成变量也可以的,只是把收到的数据存起来而已,之后我们才可以去调用)

if(I2C1->SR3&0x80)

{

base = &B_I2C_p1;//add1

}

else

{

base = &B_I2C_p2_0x46;//add2

}


if(I2C1->SR1&0X02) //SR1的第一位会检测广播地址是否匹配

{

(void)(I2C1->SR3); //先读I2C_SR1,再读I2C_SR3,就可以清除ADDR

// I2C->DR = 0X00;

I2C_Tx_Idx=0;

I2C_Rx_Idx=0;

I2C1->DR = Slave_Buffer_Tx[I2C_Tx_Idx++];

}

if(I2C1->SR1&0X10) //停止条件

{

Nuse = I2C1->CR2; //清除停止位(SR1第4位),先读SR1,再写CR2

nop();

I2C1->CR2 = Nuse;

}

if(I2C1->SR1&0X04) //BTF位,先读SR1,再读或者写DR寄存器清除

{

Nuse=I2C1->DR;

// I2C->DR=Nuse;

}

if(I2C1->SR1 & 0x40) //RXNE,数据寄存器是否为空,0空1非

{

//将收到的数据储存到RX数组中。虽然我们是从机,用不到这里的数据,但是这里必须读DR寄存器收取数据.不然会出错

Slave_Buffer_Rx[I2C_Rx_Idx++]=I2C1->DR;

if(I2C_Rx_Idx>=MAX_Id)

{

I2C_Rx_Idx=0;

}

}

if(I2C1->SR1 & 0x80) //将发送的数据放入DR寄存器,清除TXE

{

I2C1->DR = Slave_Buffer_Tx[I2C_Tx_Idx++];

if(I2C_Tx_Idx>=MAX_Id)I2C_Tx_Idx=0;

}


}


很多人都说硬件I2C不稳定,不好用,不过就我目前测试来讲,还是挺稳定好用的.

关键字:STM8L051F3  硬件I2C  从机实例  新手导航 引用地址:STM8L051F3 硬件I2C从机实例--新手导航

上一篇:解决STM32 I2C接口死锁在BUSY状态的方法讨论
下一篇:使用STM8S自带BootLoader_1

推荐阅读最新更新时间:2024-11-10 10:04

STM8L051F3_04_PWR应用
本章介绍STM8L051F3的PWR相关知识,并重点介绍它的低功耗模式与应用。内容分为以下几部分: 低功耗模式介绍 WFI模式应用 1、低功耗模式介绍 STM8L系列就是STM8的低功耗系列,所以该系列的主要特点就是低功耗。STM8L051F3低功耗模式如下图: 注:在执行HALT指令之前,应用程序必须通过清除相应的外设中断配置寄存器的中断标志位来清除所有的外设中断,否则HALT指令不会被执行,程序继续往下执行。 Wait mode(等待模式):Wait mode有两种:一种是WFI(通过中断方式唤醒);另一种是WFE(通过事件方式唤醒)。执行WFI或WFE即可进入到相应的Wait mode。在该模式下,振荡器是保持运
[单片机]
STM32F10x_硬件I2C读写EEPROM(标准外设库版本)
Ⅰ、写在前面 上一篇文章是“STM32F10x_模拟I2C读写EEPROM”,讲述使用IO口模拟I2C总线通信,对EEPROM(AT24Xxx)进行读写操作的过程。 上一篇文章主要内容:I2C协议、模拟I2C底层驱动、EEPROM(AT24Xxx)单字节读写操作。 本文主要内容:STM32硬件I2C详细配置、EEPROM(AT24Xxx)多字节读写操作、ST官方I2C存在问题。 实例实验效果: 1、多字节读写:任意地址(66), 写入任意长度(129)、读取并打印出来 2、单字节读写:任意地址(0),写入1字节数据、 读取并打印出来 实验说明: 1.多字节读写 实验为什么是从66地址写? 为什么
[单片机]
STM32F10x_<font color='red'>硬件</font><font color='red'>I2C</font>读写EEPROM(标准外设库版本)
STM8L052C6硬件I2C调试:PCF8563/BM856时钟芯片
网上基本都提倡用软件模拟I2C,之前读温湿度传感器也是用模拟的。这次有时间和机会再次用上I2C,固决定用硬件I2C调试下,目前看来没有问题,读写设备都正常。 一、注意事项 1、I2C硬件上需要外部上拉,单纯软件上拉不行。 2、如连续读个字节如8563的second~years数据共7 bytes,中间需要delay。否则只能成功读取前两个byte, clock会断掉。具体delay时间没有确切的验证,用如下实例代码测试OK。 3、查看是否有time定时中断,读写过程最好先关中断。 二、工程下载 https://download.csdn.net/download/xqw19891201/11267260
[单片机]
STM32中FSMC与硬件I2C冲突
ST官网勘误表中列到,FSMC与I2C不能同时开启。解决的办法可以有 1:将I2C映射到PB9,PB8. 2:使用模拟的I2C. I/O重映射步骤:(以串口为例) 1.打开重映射时钟和USART重映射后的I/O口引脚时钟, RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RC C_APB2Periph_AFIO,ENABLE); 2.I/O口重映射开启. GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE); 3.配制重映射引脚, 这里只需配置重映射后的I/O,原来的不需要去配置.(映射的引脚是固定的,查手册可得) GPIO_InitStruct
[单片机]
【STM32Cube_15】使用硬件I2C读取温湿度传感器数据(SHT30)
本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I2C外设,读取SHT30温湿度传感器的数据并通过串口发送。 1. 准备工作 硬件准备 开发板 首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi): SHT30温湿度传感器 SHT30温湿度传感器是一个完全校准的、现行的、带有温度补偿的数字输出型传感器,具有 2.4V-5.5V 的宽电压支持,使用IIC接口进行通信,最高速率可达1M并且有两个用户可选地址,除此之外,它还具有8个引脚的DFN超小封装,如图: SHT30的原理图如下: 软件准备 需要安装好Keil - MDK及芯片对应的包,以便编译和下载
[单片机]
【STM32Cube_15】使用<font color='red'>硬件</font><font color='red'>I2C</font>读取温湿度传感器数据(SHT30)
STM32F10x_硬件I2C主从通信 (轮询发送,中断接收)
Ⅰ、写在前面 关注我分享文章的朋友应该知道我在前面讲述过(软件、硬件)I2C主机控制从机EEPROM的例子。在I2C通信主机控制程序是比较常见的一种,可以说在实际项目中,很多应用都会使用到I2C通信。但在实际项目中作为I2C从机的应用相对要少的多,本文主要讲述关于【STM32F10x_硬件I2C主从通信】中STM32作为从机的例子。 在学习本问内容之前,如果对I2C协议还不太了解的朋友请先去了解一下I2C协议,或看我之前关于I2C通信的文章(我微信公众号和博客都有)。 关于STM32硬件I2C作为从机的文章网上很少(我在写本文之前也在百度、谷歌等网站上搜索了解过),我猜测大概的原因主要是两点:1.使用该功能的人比较少; 2
[单片机]
STM32F10x_<font color='red'>硬件</font><font color='red'>I2C</font>主从通信 (轮询发送,中断接收)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved