这几天调试STM8S105K4芯片的I2C主模式,始终无法调通,最大的问题出在SR3的BUSY为始终为1,以下是我的代码: #include "iostm8s105k4.h" uchar unsigned STATE; int main( void ) { uchar unsigned itx = 0; CLK_CKDIVR_HSIDIV = 0x00; // 16M内部RC经2分频后系统时钟为8M CLK_CKDIVR_CPUDIV = 0x00; CLK_PCKENR1 |= 0x01; // 打开f(MASTER)与外设I2C的连接 I2C_FREQR |= 0x08; //输入外设时钟频率为8MHz I2C_CR1 = 0x00; //禁止I2C外设 I2C_TRISER = 0x0C; I2C_CCRL = 0x40; I2C_CCRH = 0x00; PB_DDR_DDR4 = 0; // 设置为输入 PB_CR1_C14 = 0; // 设置为开漏 PB_CR2_C24 = 0; PB_DDR_DDR5 = 0; PB_CR1_C15 = 0; PB_CR2_C25 = 0; itx = I2C_SR3; //此处itx为0x02,即BUSY位为1 STATE = itx; I2C_CR1 |= 0x01; //开启I2C外设 I2C_CR2 |= 0x04; //应答使能 I2C_OARL = 0xfe; //自身地址 I2C_OARH = 0x40; itx = I2C_SR3; //此处itx还是为0x02,即BUSY位为1 STATE = itx; I2C_CR2_SWRST = 1; // I2C系统复位 itx = I2C_SR3; //此处itx为0x00,但I2C系统在复位 STATE = itx; I2C_CR2_SWRST = 0; // I2C系统完成复位 itx = I2C_SR3; //此处itx依然为0x02,即BUSY位为1 STATE = itx; while (1) { } return 0; } 说明: 1、电路中SCL和SDA都有上拉电阻,始终都是高电平,系统尝试过连接过DS1307(其在别的型号芯片的I2C主系统中测试正常)、也尝试过不连任何外设; 2、I2C电路的端口,试过上拉、开漏、输入、输出、高速、普通,还试过放到设置Fmaster前、后的位置,或根本不设置; 3、该段程序在仿真器上BUSY位为0,但一但到机子上就不行了; 4、当忽略掉BUSY位后,无论发出START或STOP,无论设不设ACK,线路上都没有反应; 5、系统使用内部高速时钟产生16MHz; 6、该代码仅为I2C测试代码,其余部分UART、ADC、TIME都能够正常工作; 7、该问题在2个样机上都出现,导致没法进行下去了; 8、该代码在IAR for STM8系统下编译,使用的是ST_Link做为仿真及写入工具,Device选择为:STM8S105K4,其余设置为默认设置; 由于线路BUSY位无法清除,系统就无法工作,有无那位高手能够给点指点! |
从零开始操作STM8寄存器(风驰iCreate奉献)
【中文资料】初学STM8库函数的中文帮助软件
绝对经典的中文STM8学习手册,淘宝上学习板资料,友情大放送!
【原创教程】风驰iCreate独家开源STM8 27个例程和10多万字的pdf教程
STM8的LCD1602 4线驱动,为什么不工作
【精华资料】由零开始开发STM8
STM8S 的触摸库是如何在主程序中查询键的呢、
【精华资料】STM8的C语言编程1-14讲完整版
【精品教程】STM8系列单片机入门教程系列
STM8 第一次进中断不准【悬赏问答】
RE:STM8S105K4的I2C主模式BUSY位始终为1故障求助
兄弟,解决了吗?
如果说你确认过总线都为高, 那就是IO配置的问题了
这个标志为只有检测到任一线为0的时候才会为1的
看你一楼所说的, 你不会是没加外部上拉吧?
https://www.stmcu.org.cn/module/forum/?fromuid=3552542