打印
[STM8]

求解STM8L 硬件I2C

[复制链接]
13191|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chenwei1919|  楼主 | 2010-7-20 11:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM8L的I2C设置时是否需要设置GPIO(PC0,PC1),我在初始化时设置如下:
  CLK_PeripheralClockConfig(CLK_Peripheral_I2C1, ENABLE);
  I2C_Cmd(I2C1, ENABLE);
  I2C_Init(I2C1, 100000, 0xA0, I2C_Mode_I2C, I2C_DutyCycle_2,
           I2C_Ack_Enable, I2C_AcknowledgedAddress_7bit);

初始化完成后
    I2C_GenerateSTART(I2C1, ENABLE);
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
结果死在while循环中,是不是我的I2C没有使能啊?
沙发
IJK| | 2010-7-20 13:25 | 只看该作者
STM8L的I2C设置也需要设置GPIO(PC0,PC1)为OD输出,这跟STM8S、STM32F是类似的。

使用特权

评论回复
板凳
chenwei1919|  楼主 | 2010-7-20 13:43 | 只看该作者
设置为OD输出了,系统时钟为CLK_SYSCLKDiv_4,电阻上拉,但是未连接其他I2C的设备,程序运行到这里不知道有没有影响

使用特权

评论回复
地板
IJK| | 2010-7-20 13:56 | 只看该作者
未连接其他I2C的设备,程序运行到发送 START位 应该没有影响

使用特权

评论回复
5
chenwei1919|  楼主 | 2010-7-20 14:04 | 只看该作者
那就应该是I2C没有使能,我查了stm8l1526开发板的代码,发现没什么特别之处啊,而且他并没有初始化IO为OD输出

使用特权

评论回复
6
chenwei1919|  楼主 | 2010-7-20 17:10 | 只看该作者
难道大家都不用硬件I2C,谁共享一段I2C初始化的代码啊?

使用特权

评论回复
7
IJK| | 2010-7-20 17:13 | 只看该作者
我的初始化代码大约是这样,供参考:
CLK_PeripheralClockConfig(CLK_Peripheral_I2C1, ENABLE);
  GPIO_Init(GPIOC, GPIO_Pin_1 | GPIO_Pin_0, GPIO_Mode_Out_OD_HiZ_Fast);
  I2C_DeInit();
  I2C_Init(I2C1, 50000, 0xA0, I2C_Mode_I2C, I2C_DutyCycle_2,
           I2C_Ack_Disable, I2C_AcknowledgedAddress_7bit);
  I2C_Cmd(I2C1, ENABLE);

使用特权

评论回复
8
CrazyST| | 2010-7-20 19:05 | 只看该作者
stm8的硬件I2C不好用,我宁愿用模拟的,不就两端口嘛

使用特权

评论回复
9
秋天落叶| | 2010-7-20 20:19 | 只看该作者
我也比较赞成用模拟的,感觉楼主I2C初始化程序没什么问题

使用特权

评论回复
10
静默| | 2010-7-21 17:17 | 只看该作者
供参考....

/**
  ******************************************************************************
  * @file Dev_I2C.c
  * @brief I2C共用的C文件..
  * @author WuHan P&S 电力电子组.
  * @version V 0.0.1
        * @Target STM8L
  * @date 11/10/2009
  ******************************************************************************
  */

#include "dev_i2c.h"

void I2C_Delay(u32 nCount)
{
    /* Decrement nCount value */
    while (nCount != 0)
    {
        nCount--;
    }
}

// 释放I2C总线.
void I2C_BusRelease(void)
{
        GPIO_Init(I2C_PORT, (I2C_SDA_PIN | I2C_SCL_PIN), GPIO_Mode_Out_PP_High_Fast);

        I2C_Delay(500);
        GPIO_WriteBit( I2C_PORT, I2C_SCL_PIN, RESET );                // SCL为低
        GPIO_WriteBit( I2C_PORT, I2C_SDA_PIN, RESET );                // SDA为低
        I2C_Delay( 500 );
        GPIO_WriteBit( I2C_PORT, I2C_SCL_PIN, SET );        // SCL 为高
        I2C_Delay( 500 );
        GPIO_WriteBit( I2C_PORT, I2C_SDA_PIN, SET );        // SDA 为高
        I2C_Delay( 500 );
}

/**
  * @brief Initializes the I2C peripheral registers to communicate the EEPROM
  * @par Parameters:
  * None
  * @retval None
  * @par Required preconditions:
  * None
  */

I2C_Op_TypeDef I2C_BusInit(void)
{  
        u32 lu32TimeOut;
       
        I2C_BusRelease();
        I2C_BusRelease();
        I2C_BusRelease();

        /* Optional: put here as example only */
        I2C_DeInit( I2C1);

        /*Enable I2C1 clock */
        CLK_PeripheralClockConfig(CLK_Peripheral_I2C1, ENABLE);

        /* I2C Peripheral Enable */
        I2C_Cmd(I2C1, ENABLE);
        /* Apply I2C configuration after enabling it */
        I2C_Init(I2C1, I2C_Speed, I2C_OWN_ADDRESS7, I2C_Mode_I2C, I2C_DutyCycle_2, I2C_Ack_Enable, I2C_AcknowledgedAddress_7bit );
        I2C_Delay( 100 );

        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY ))
        {
                if( lu32TimeOut ++ >= CNT_I2C_DELAY_COUNT )
                {
                        return CNT_I2C_FAIL;
                }
        }
       
        return CNT_I2C_SUCCESS;

}


/**
  ******************************************************************************
  * @file Dev_I2C.h
  * @brief I2C共用的头文件..
  * @author WuHan P&S 电力电子组.
  * @version V 0.0.1
        * @Target STM8L
  * @date 11/10/2009
  ******************************************************************************
  */
#ifndef __DEV_I2C__H
#define __DEV_I2C_H

/* Includes ------------------------------------------------------------------*/
#include "stm8l15x.h"

#define I2C_Speed              100000  
#define I2C_OWN_ADDRESS7             0x88
// 若是STM8S2XX时,I2C的SCL--PE1, SDA--PE2.
#define I2C_PORT                        GPIOC
#define I2C_SDA_PIN           GPIO_Pin_0
#define I2C_SCL_PIN                GPIO_Pin_1

#define CNT_I2C_DELAY_COUNT        1000

typedef enum
{
        CNT_I2C_SUCCESS = (u8) 1,                // 操作成功
        CNT_I2C_FAIL    = (u8) 0                        // 操作失败
} I2C_Op_TypeDef;                                                        // E2操作类.

void I2C_Delay(u32 u32Count);
// 释放I2C总线.
void I2C_BusRelease(void);
// I2C 初始化.
I2C_Op_TypeDef I2C_BusInit(void);

#endif // _DEV_I2C_H

使用特权

评论回复
11
静默| | 2010-7-21 17:20 | 只看该作者
// I2C_BusInit调用完后可做如下工作,
    I2C_GenerateSTART(I2C1, ENABLE);
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
// 不过最好是在while语句中加入超时控制.

使用特权

评论回复
12
chenwei1919|  楼主 | 2010-7-21 17:45 | 只看该作者
已经解决,谢谢大家,现分享下我的问题:
1.PC0,PC1初始化,GPIO_Init(GPIOC, GPIO_Pin_1 | GPIO_Pin_0, GPIO_Mode_Out_OD_HiZ_Fast);
2.必须连接硬件
3.总线不能busy,一定要空闲
初始化代码如下:
GPIO_Init(GPIOC, GPIO_Pin_0, GPIO_Mode_Out_OD_HiZ_Slow);
                GPIO_Init(GPIOC, GPIO_Pin_1, GPIO_Mode_Out_OD_HiZ_Slow);
                CLK_PeripheralClockConfig(CLK_Peripheral_I2C1, ENABLE);
                I2C_Init(I2C1, 50000, 0xA5, I2C_Mode_I2C, I2C_DutyCycle_2,
           I2C_Ack_Enable, I2C_AcknowledgedAddress_7bit);
//注:I2C_Init()里已经使能了I2C,所以可以不用I2C_Cmd(I2C1, ENABLE);
                while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));

使用特权

评论回复
13
ajiantc| | 2011-1-25 19:06 | 只看该作者
怎么没有R/W呢。。。 1# chenwei1919

使用特权

评论回复
14
ajiantc| | 2011-1-25 19:30 | 只看该作者
发现了。I2C direction

使用特权

评论回复
15
hyh19890917| | 2014-10-16 10:37 | 只看该作者
chenwei1919 发表于 2010-7-21 17:45
已经解决,谢谢大家,现分享下我的问题:
1.PC0,PC1初始化,GPIO_Init(GPIOC, GPIO_Pin_1 | GPIO_Pin_0, GP ...

你好,可以看看你I2C的代码么

使用特权

评论回复
16
mavislw| | 2015-7-11 10:00 | 只看该作者
chenwei1919 发表于 2010-7-21 17:45
已经解决,谢谢大家,现分享下我的问题:
1.PC0,PC1初始化,GPIO_Init(GPIOC, GPIO_Pin_1 | GPIO_Pin_0, GP ...

IO管脚到底是fast还是slow啊

使用特权

评论回复
17
Thor9| | 2015-7-11 21:46 | 只看该作者
总线不能busy,一定要空闲

使用特权

评论回复
18
lulugl| | 2016-7-21 18:38 | 只看该作者
楼主能不能共享下你的代码我学习一下

使用特权

评论回复
19
lulugl| | 2016-8-7 23:18 | 只看该作者
本帖最后由 lulugl 于 2016-8-7 23:20 编辑

void I2CInit(void)
{
        I2C->FREQR |=8;        //输入时钟为8M
        I2C->CCRL |=40;        //上升时间为40*,标准100K
        I2C->CCRH |= 0;        //i2c标准模式
        I2C->TRISER |=0x09;
        I2C->CR1 |=0x01;//使能i2c
}
我今天才学习到的,其实硬i2c还是很好用的,原来我没掌握寄存器操作,用库函数模拟做出来了,今天学习了库函数操作,感觉硬的也好用,代码量也少了,希望跟大家交流

使用特权

评论回复
20
虎头帮大哥| | 2016-8-25 14:00 | 只看该作者
各位,有用STM8L 硬件IIC做从机,与STM32模拟IIC做主机的双机通讯么,仿真单步调试OK,全速跑起来,从机总接收不到主机非应答信号。求解

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:前方是绝路,希望在转角

0

主题

34

帖子

1

粉丝