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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版