你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm8s I2C总线总是处于忙状态

[复制链接]
yh_terry 提问时间:2015-6-8 20:32 /
求助各位大大,我使用的是STM8S103K3,想要使用stm8通过I2C控制一个LCD的驱动芯片,在I2C写的时候,判断bus是否处于忙状态的循环无法跳出,通过示波器量I2C总线的时候是高电平。目前怀疑是自己I2C初始化不正确,但网上有的说要设置GPIO PIN,有的说不需要,请问一下I2C的初始化到底要怎么初始化?下面是我的代码:
  1. #define I2C_SLAVE_ADDRESS        0x7C
  2. #define I2C_PORT         GPIOB
  3. #define I2C_SDA_PIN         GPIO_PIN_4
  4. #define I2C_SCL_PIN         GPIO_PIN_5
  5. void main(void)
  6. {
  7.     GPIO_Init(I2C_PORT, I2C_SDA_PIN, GPIO_MODE_OUT_OD_HIZ_SLOW);
  8.     GPIO_Init(I2C_PORT, I2C_SCL_PIN, GPIO_MODE_OUT_OD_HIZ_SLOW);
  9.     CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, ENABLE);
  10.     I2C_EEInit();
  11. }
复制代码
  1. void Init_I2C(void)
  2. {
  3.         /* 复位设备 */
  4.         I2C_DeInit();
  5.         /* 初始化设备 */
  6.         I2C_EEInit();
  7. }
复制代码
  1. void I2C_EEInit(void)
  2. {
  3.         u8 Input_Clock = 0x0;
  4.         Input_Clock = CLK_GetClockFreq() / 1000000;

  5.         /* I2C Peripheral Enable */
  6.         I2C_Cmd(ENABLE);

  7.         /* Apply I2C configuration after enabling it */
  8.         I2C_Init(I2C_MAX_STANDARD_FREQ, I2C_SLAVE_ADDRESS,
  9.                          I2C_DUTYCYCLE_2, I2C_ACK_CURR,
  10.                          I2C_ADDMODE_7BIT, Input_Clock);
  11. }
复制代码
  1. void I2C_EE_ByteWrite(u8 u8CmdType, u8 *pu8Buffer, u8 u8WriteAddr)
  2. {
  3.         /* while the bus is busy */
  4.         while (I2C_GetFlagStatus(I2C_FLAG_BUSBUSY))
  5.         {
  6.         }


  7.         /* Send start condition */
  8.         I2C_GenerateSTART(ENABLE);
  9.        
  10.         /* Test on EV5 and clear it */
  11.         while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT))
  12.         {
  13.         }
  14.        
  15.         /* Send devices address for write */
  16.         I2C_Send7bitAddress(I2C_SLAVE_ADDRESS, I2C_DIRECTION_TX);

  17.         /* Test on EV6 and clear it */
  18.         while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
  19.         {
  20.         }

  21.         /* Send cmd type be written */
  22.         I2C_SendData(u8CmdType);

  23.         /* Test on EV8 and clear it */
  24.         while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING))
  25.         {
  26.         }

  27.         /* Send Address to be written & wait event detection */
  28.         I2C_SendData(u8WriteAddr);

  29.         /* Test on EV8 and clear it */
  30.         while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING))
  31.         {
  32.        
  33.         }

  34.         if (u8CmdType == 0x80)
  35.         {
  36.                 /* Send the byte to be written */
  37.                 I2C_SendData(*pu8Buffer);

  38.                 /* Test on EV3 and clear it */
  39.                 while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING))
  40.                 {
  41.                
  42.                 }
  43.         }

  44.         /* Send stop condition */
  45.         I2C_GenerateSTOP(ENABLE);
  46.         return;
  47. }
复制代码
这个问题困扰我好久了,请大家帮忙看一下,谢谢各位了!!!
收藏 1 评论15 发布时间:2015-6-8 20:32

举报

15个回答
meisk 回答时间:2017-5-24 17:41:24
终于搞清楚了,是在仿真或烧写的OPTIONS中配置复用功能,不需要在程序中写配置代码,好大一个坑啊,花了我一天时间
yh_terry 回答时间:2015-6-9 15:33:05
问题已经解决了...I2C是复用的GPIO的管脚,我没有设置这个GPIO为I2C导致的...
小小超 回答时间:2015-6-9 10:20:38
ST的硬件I2C让人很头痛。还是用模拟的吧。简单的来而且还方便
jacobfeng 回答时间:2015-6-11 20:47:04
支持一下
为什么是EEFOCUS小白 回答时间:2015-6-13 15:14:15
直接模拟吧
saefra 回答时间:2015-11-11 11:25:49
yh_terry 发表于 2015-6-9 15:33
问题已经解决了...I2C是复用的GPIO的管脚,我没有设置这个GPIO为I2C导致的...

请问具体怎么解决,遇到同样的问题。一直忙~~~
foxglove 回答时间:2015-11-11 14:42:43
没有设置这个GPIO为I2C导致的
天行健01 回答时间:2016-1-14 14:34:22
直接在配置字中设置端口为I2C.然后不需要再进行GPIO设置
xmshao 回答时间:2016-1-16 11:57:30
本帖最后由 xmshao 于 2018-1-9 22:52 编辑


相关I2C管脚的复用配置可以在STVP等编程工具里配置、也可以自己编程实现。一般用工具更方便点。

zcl201207 回答时间:2016-1-16 20:40:53
无情-336294 回答时间:2017-1-18 14:32:11
xmshao 发表于 2016-1-16 11:57
对于STM8S103K来说 PB4/5做 I2C并不用特别的选项字配置。相关I2C配置好就能用的。

楼主说 “I2C是复用的GP ...

大神在九楼
顺便问一句 STM8的I2C是真开漏输出的么
zbber 回答时间:2017-1-18 15:06:47
直接模拟吧
fafa1 回答时间:2017-3-7 17:44:31
几点疑问:
1、有了I2C_Cmd(ENABLE);还需要CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, ENABLE);吗?
2、I2C_Init(I2C_MAX_STANDARD_FREQ, I2C_SLAVE_ADDRESS,               //这里不应该是从机地址吧?
                         I2C_DUTYCYCLE_2, I2C_ACK_CURR,
                         I2C_ADDMODE_7BIT, Input_Clock);
3、GPIO_Init(I2C_PORT, I2C_SDA_PIN, GPIO_MODE_OUT_OD_HIZ_SLOW);
    GPIO_Init(I2C_PORT, I2C_SCL_PIN, GPIO_MODE_OUT_OD_HIZ_SLOW);
管脚配置需要吗?

我现在也是判断状态死循环啊,求助!
lilyoung0827 回答时间:2017-8-8 15:47:29
meisk 发表于 2017-5-24 17:41
终于搞清楚了,是在仿真或烧写的OPTIONS中配置复用功能,不需要在程序中写配置代码,好大一个坑啊,花了我 ...

这位大神,能不能教下怎么设置烧写和仿真的复用功能
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版