总结stm8硬件IIC主模式的寄存器设置及调试心得

最新更新时间:2019-04-02来源: eefocus关键字:stm8  硬件IIC  主模式  寄存器设置 手机看文章 扫描二维码
随时随地手机看文章

一、开发环境


开发软件:STVD


芯片型号:stm8s103


硬件接口:I2C(主模式)


二、寄存器主要用到的功能(按用户手册的顺序)


1. I2C_CR1(控制寄存器1):


(1)bit0:控制I2C模块的启动/禁用。此功能主要用于I2C总线初始化的时候,配置TRISER相关寄存器功能的时候必须先禁用I2C模块才可以进行写操作。


2. I2C_CR2(控制寄存器2)


(1)bit7:设置1实现软复位I2C模块。当I2C总线始终处于繁忙状态的时候通过复位实现恢复。


(2)bit3:设置ACK应答的位置。在I2C总线初始化的时候配置,通常是作清零操作,用于表示ACK位控制被移位寄存器正在接收的这个当前字节的应答或者不应答。


(3)bit2:设置ACK应答使能。这个位需要根据协议决定是否需要使能ACK,并在I2C主机每读取来自从机的一字节数据之前进行设置,这样硬件II2C就会自动在读取到数据后作出对应的ACK响应。实际上这个ACK应答是始终存在的,如果该位为0,表示当前应答位为NACK,许多I2C设备在读取最后一个字节的数据的时候会要求主机回复的是NACK,其实就是把该位设置为0即可。


(4)bit1:设置该位用于产生停止位。用于释放总线,也就是总线恢复闲置状态。


(5)bit0:设置该位用于产生起始位。产生起始位后,进入主模式。


3. I2C_FREQR(频率寄存器)


(1)bit5~0:设置外设时钟的频率。有效的取值范围0b000001~0b110010表示1MHz~50MHz。在I2C总线初始化的时候配置;如果用内部晶振,数值设置为16即可表示外设时钟的频率是16MHz;如果用的是外部晶振,根据外部晶振的时钟频率设置对应的数值即可。


4. I2C_OARL(自身地址寄存器LSB)


(1)bit7~1:设置主机在I2C总线上自身的地址(地址的第7:1位)。


(2)bit0:设置主机在I2C总线上的自身地址(地址的第0位,在地址位数为10的时候有效)




5. I2C_OARH(自身地址寄存器MSB)


(1)bit2~1:设置主机在I2C总线上的自身地址(地址的第9:8位,在地址位数为10的时候有效)




6. I2C_DR(数据寄存器)


(1)bit7~0:用于存放接收到的数据或放置用于发送到总线的数据。这个寄存器的用法很简单,主机需要往从机写数据的时候把数据按字节写入此寄存器即可,主机需要往从机读数据的时候把这个寄存器内的数据读取并写入变量中即可。




7. I2C_SR1(状态寄存器1)


(1)bit7:通过判断该位可以知道写入I2C_DR的数据是否已经全部发送出去,从而决定是否开始发送下一个字节的数据。


(2)bit6:通过判断该位可以知道是否接受到来自从机的数据,该位被置位的状态下,从I2C_DR中读取数据才是有意义的。


(3)bit1:通过判断该位可以知道需要与主机进行通讯的从机地址是否已经发送。


(4)bit0:通过判断该位可以知道起始位是否已经发送。




8. I2C_SR2(状态寄存器2):目前开发过程中没有用到该寄存器。




9. I2C_SR3(状态寄存器3):目前开发过程中没有用到该寄存器。




10. I2C_ITR(中断寄存器):如果开发时希望特定事件以中断形式通知,可以通过该寄存器来实现。比如,写入一字节数据至I2C_DR寄存器后,CPU处理其它事件,当收到TXE触发的中断事件后,再写下一字节数据。这样CPU在处理整个I2C读写事件的过程中可以不需要进行循环判断等待。




11. I2C_CCRL(时钟控制寄存器低位部分),I2C_CCRH(时钟控制寄存器高位部分)


(1)这两个寄存器在I2C总线初始化的时候进行配置,需要注意的是这两个寄存器需要在I2C模块禁用的状态下改变值。


(2)I2C_CCRH的bit7:如果I2C通讯速度小于等于标准速度(100KHz),该位置0;如果I2C通讯速度大于标准速度,则该位置1表示是快速模式(比较常用的是400kHz)


(3)I2C_CCRL的bit6:表示快速模式下的占空比,即I2C总线的SCL时钟信号的低电平时间(t_low)与高电平时间(t_high)的比值。t_low+t_high就是一个SCL时钟信号脉冲周期的长度,i2c总线的通讯速度f_scl = 1/(t_low+t_high)。假如单片机采用16MHz的外部晶振且I2C通讯速度是400KHz的情况下,


(4)I2C_CCRH的bit3:0以及I2C_CCRL的bit7~0共12个bit表示CCR的值。CCR的具体计算方式举个例子大致描述一下:假如单片机采用16MHz的外部晶振(即t_ck=16)且I2C通讯速度是400KHz的情况下,此时采用占空比为16:9(I2C_CCRL的bit6设置为1),则CCR=(t_ck)/[1/(t_low+t_high)*(25)]=(16*1000000)/(400000*25)= 1




12. I2C_TRISE(TRISE寄存器)


(1)bit5~0:在快速/标准模式下的大上升时间(主模式)。这个时间需要根据从机的特性需求来设置。


标准模式(100KHz)下的计算公式:(1000ns / t_pclk1 + 1) ns; t_pclk1为从机的最大上升时间


快速模式(400KHz)下的计算公式:(300ns / t_pclk1 + 1)ns




三、调试心得


1. 如果外设时钟的频率小于10MHz,建议在标准模式(100KHz通讯速度)下进行开发调试。


2. 发送从机地址时(7-bit),需要加上1bit读写位(0为写,1为读),拼成一整个字节进行发送。


3. 发送完地址+读写字节后,必须对I2C_SR3寄存器进行读操作,实现清状态寄存器,否则总线会堵死。


4. 读取数据前需设置ACK应答,如果需要NACK则设置ACK应答位为0(示例函数中ACK设置为0,需根据协议需求进行修改)




四、读写函数代码


1. 主机往从机读一个字节数据:


#define I2C_OVER_TIME   0xFA  // 超时处理时间需要根据晶振频率调整

#define SLAVE_ADDR_WR   0x20  // 7-bit从机地址 + 1-bit写信号

#define SLAVE_ADDR_RD   0x21  // 7-bit从机地址 + 1-bit读信号

u8 I2C_Read_Byte(u8 reg, u8 *pdata)

{

u16 cnt = 0;


    /* Generate start & wait event detection */

    I2C->CR2 |= 0x01; 

while (!(I2C->SR1 & 0x01))

{

if ( ++cnt > I2C_OVER_TIME )

{

/* Generate stop signal */

    I2C->CR2 |= 0x02; 

return 1;

}

}


cnt = 0;

/* Send slave Address in write direction & wait detection event */

    I2C->DR = SLAVE_ADDR_WR;

while (!(I2C->SR1 & 0x02))

{

if ( ++cnt > I2C_OVER_TIME )

{

/* Generate stop signal */

    I2C->CR2 |= 0x02;  

return 1;

}

}

    I2C->SR3;


cnt = 0;

/* Send register to be read */

I2C->DR = reg; 

    while(!(I2C->SR1 & 0x80))

{

if ( ++cnt > I2C_OVER_TIME )

{

/* Generate stop signal */

    I2C->CR2 |= 0x02; 

return 1;

}

}

    

    cnt = 0;

/* Generate start & wait event detection */

    I2C->CR2 |= 0x01; 

while (!(I2C->SR1 & 0x01))

{

if ( ++cnt > I2C_OVER_TIME )

{

/* Generate stop signal */

    I2C->CR2 |= 0x02; 

return 1;

}

}


cnt = 0;

/* Send register to be read */

I2C->DR = SLAVE_ADDR_RD; 

    while(!(I2C->SR1 & 0x02))

{

if ( ++cnt > I2C_OVER_TIME )

{

/* Generate stop signal */

    I2C->CR2 |= 0x02;  

return 1;

}

}

I2C->SR3;


cnt = 0;

I2C->CR2 &= ~0x04; //nack 

/* waiting for byte from slave */

while (!(I2C->SR1 & 0x40))

{

if ( ++cnt > I2C_OVER_TIME )

{

/* Generate stop signal */

    I2C->CR2 |= 0x02; 

return 1;

}

}

    *pdata = (u8)(I2C_ReceiveData());


    /* Generate stop signal */

    I2C->CR2 |= 0x02; 


return 0;

}


2. 主机往从机写一字节数据:

u8 I2C_Write_Byte(u8 reg,u8 data)  

u16 cnt = 0;


/* Generate start & wait event detection */

I2C->CR2 |= 0x01;

while (!(I2C->SR1 & 0x01))

{

if ( ++cnt > I2C_OVER_TIME )

{

I2C_GenerateSTOP(ENABLE); 

return 1;

}

}


cnt = 0;

/* Send slave Address in WRITE direction & wait detection event */

I2C->DR = SLAVE_ADDR_WR;

while (!(I2C->SR1 & 0x02))

{

if ( ++cnt > I2C_OVER_TIME )

{

I2C_GenerateSTOP(ENABLE);

return 1;

}

}

I2C->SR3;


cnt = 0;

/* Send internal register address to write */

I2C->DR = reg;

while(!(I2C->SR1 & 0x80))

{

if ( ++cnt > I2C_OVER_TIME )

{

I2C_GenerateSTOP(ENABLE);

return 1;

}

}


cnt = 0;

/* Send Data to write */

I2C->DR = data;

while (!(I2C->SR1 & 0x80))

{

if ( ++cnt > I2C_OVER_TIME )

{

I2C_GenerateSTOP(ENABLE);

return 1;

}

}

 

    I2C_GenerateSTOP(ENABLE); 


return 0;

}



关键字:stm8  硬件IIC  主模式  寄存器设置 编辑:什么鱼 引用地址:总结stm8硬件IIC主模式的寄存器设置及调试心得

上一篇:stm8 IAR 编译错误Fatal Error[Cp001]
下一篇:STM8L051的硬件I2C调试

推荐阅读最新更新时间:2023-08-08 15:05

IAR for STM8介绍、 下载、安装与注册
Ⅰ、写在前面 本文讲述的内容是IAR for STM8(EWSTM8)的介绍、下载、安装与注册,其安装、注册过程和IAR for ARM类似,如果需要了解IAR for ARM相关的文章,可以到我博客,或微信公众号查看并下载。 IAR系列教程: http://blog.csdn.net/column/details/13696.html 本文内容已经整理成PDF文件,提供给大家下载: http://pan.baidu.com/s/1geClBrH Ⅱ、IAR介绍 1.关于IAR IAR是一家公司的名称,也是一种集成开发环境的名称,我们平时所说的IAR主要是指集成开发环境。 IAR这家公司的发展也是经历了一系列历史变
[单片机]
IAR for <font color='red'>STM8</font>介绍、 下载、安装与注册
意法半导体推出新图形用户界面配置器,让STM8微控制器设计变得更快捷
意法半导体最新发布的STM8CubeMX g图形界面配置器让基于深受市场欢迎的8位STM8微控制器的产品设计变得更快捷。下面就随单片机小编一起来了解一下相关内容吧。 意法半导体推出新图形用户界面配置器,让STM8微控制器设计变得更快捷 STM8CubeMX支持 意法半导体 的全部主流低功耗汽车8位微控制器,新版免费开发工具帮助设计人员从 STM8 产品家族中选择一款最适合其应用需求的产品。设计人员也可直接在 意法半导体 的 STM8 开发板上开发应用。首先,按照所选电路板上的微控制器的配置方式配置这款工具,然后STM8CubeMX提供多个图形界面工具,帮助完成所选微控制器的基本配置。这些配置工具包括冲突自动解决引脚配置器、
[单片机]
意法半导体推出新图形用户界面配置器,让<font color='red'>STM8</font>微控制器设计变得更快捷
stm8下载程序(使用ST-LINK下载器和STVP下载软件)
首先要说下为什么要建立烧写工程呢- -原因只有一个。因为你不可能将源码工程交给别人去帮你烧程序。 - -然后要吐槽下ST官方的IDE。真的。用得我极度不爽。所以后来转战IAR。结果发现IAR没法批量生产- -因为IAR少程序貌似一定要在工程下。不能直接将HEX文件烧写进板子里。所以最后还是要用STVP来批量烧。 首先要准备好你的烧写文件。HEX或者S19。文件。(用IAR或者STVD生成的,前提必须保证你程序没问题- -这个肯定不用说)。 第一步:然后打开STVP 打开之后是这样的 第二步:点击OPTION BYTE 。ROP ON。这个是每次烧写完将FLASH锁住。以免别人读你的IC。 还有如果你晶振是24M
[单片机]
<font color='red'>stm8</font>下载程序(使用ST-LINK下载器和STVP下载软件)
STM8单片机学习总结初步02
之前做的PCB板回来前,需构建“驱动代码”的“架构”问题,相对简单,按流程图整理出的文件截图共2页,具体如下: 第1页: 第2页: --------------------------华丽分割线 1------------------------- 编程使用的“版本”为“IAR for STM8 1401”,使用还不错,比较顺手,由于已经完成过部分驱动,并将所有头文件封装进 includes.h 中,包含的头文件如下: #ifndef __INCLUDES_H_FOR_STM8 #define __INCLUDES_H_FOR_STM8 #include ultra_maps.h #include ultra_edi
[单片机]
<font color='red'>STM8</font>单片机学习总结初步02
STM8 I2C从机
宏定义 #define SLAVE_ADDR 0x51 #define I2CSPEED 400000 //i2c速度 stm8l051 i2c从机初始化 /* I2C clock Enable*/ CLK_PeripheralClockConfig(CLK_Peripheral_I2C1, ENABLE); I2C_DeInit(I2C1); I2C_Init(I2C1, I2CSPEED, SLAVE_ADDR , I2C_Mode_I2C, I2C_DutyCycle_2, I2C_Ack_Enable, I2C_AcknowledgedAddress_7bit); /*
[单片机]
IAR ARM、IAR STM8、IAR MSP430共用一个IDE
试了安装好多个不同版本不同编译器的IAR,终于明白不同编译器的IAR共用IDE的条件,把几个不同编译器的IAR安装在一起,共用IDE。 以上几个编译器编译仿真STM32、STM8、MSP430正常,仿真器为J-Link、ST-Link、FET430UIF,编译器版本为:CD-EWARM-6101-2180、CD-EWSTM8-1301、CD-EW430-5201。 不同编译器的IAR共用IDE的条件是:IDE版本相同,也就是IarIdePm.exe版本相同 IarIdePm.exe版本一般为x.x.x,只要前面两位相同即为版本相同了,安装的时候即使目录相同,安装也不会警告。 如果IDE版本不同,可以强制安装在同一个目录,
[单片机]
IAR ARM、IAR <font color='red'>STM8</font>、IAR MSP430共用一个IDE
STM8单片机启动流程彻底探究--基于IAR开发环境
初学STM8会发现,STM8官方的固件库并没有提供一个.s文件的启动代码,那么她是如何启动然后跳转到main函数执行的呢 首先,我们根据ARM的只是可以推测,STM8也是通过复位向量来启动的,假设流程在复位响亮中完成的,应该首先去复位向量表中间去找,看复位向量又要看存储器映射,一环扣一环 STM8使用的是统一编址技术,以下是存储器编址图 我们可以看到,最大取指空间是0XFFFFFF,也就是说,是16M,这是因为PC的特性决定的 在程序内部,它是将16M分为了256个节(sector),每个节的大小为64K,64*256= 16384K=16M,由图我们可以看到,在SECTOR0区间里面似乎还有些玄妙,之后的就是普通
[单片机]
<font color='red'>STM8</font>单片机启动流程彻底探究--基于IAR开发环境
基于STM8及UHFRF收发器SX1231的无线射频收发系统
(1)发射功率限值:5mW(e.r.p); (2)发射信号的占空比限值:1%; (3)载波频率容限:100 10-6; 并把该类设备归类于 各类民用设备的无线电控制装置中。 从上面的规定中可以看到,该频段可用带宽为600kHz,但并没有明确在该频道使用的带宽,数据速率以及调制方式方面要求,这就给予了应用很大的空间。本文主要是基于868MHz频段的要求,设计了比较简单通用的无线收发系统,该系统可适用于该频段的不同的无线传输应用。 SX1231介绍及性能描述 SX1231芯片是Semtech公司推出的一款高集成度、低功耗、多频段的UHF RF收发器。其工作电压为1.8V~3.6V,24引脚QFN封装,工
[单片机]
基于<font color='red'>STM8</font>及UHFRF收发器SX1231的无线射频收发系统
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2023 EEWORLD.com.cn, Inc. All rights reserved