打印

STM32F107de I2C使用

[复制链接]
3454|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sunnyhey|  楼主 | 2013-2-1 19:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32F107里的I2C是不是不好用啊?我发送完起始条件,然后读取EV5,正确,然后发送从地址,再读取EV6时就是跳不过去,进入函数看,发现独到的数据分析出来是没收到ACK。然后一直无法进行下去,是怎么回事啊?
/* Send STRAT condition */
    I2C_GenerateSTART(I2C1, ENABLE);
  
    /* Test on EV5 and clear it */
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));   
  
    /* Send EEPROM address for write */
    I2C_Send7bitAddrss(eI2C1, SlaveAddr, I2C_Direction_Transmitter);
  
    /* Test on EV6 and clear it */
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));    //一直死在这里。。。
  
沙发
uet_cache| | 2013-2-1 21:16 | 只看该作者
STM32 IIC都不好用。建议用模拟的。速度也不会慢,也不容易出错。

使用特权

评论回复
板凳
sunnyhey|  楼主 | 2013-2-4 16:06 | 只看该作者
uet_cache 发表于 2013-2-1 21:16
STM32 IIC都不好用。建议用模拟的。速度也不会慢,也不容易出错。

可是我用模拟的还是这样的问题啊,还是发送完地址,等待EV6的时候,没有收到ACK信号。。。

使用特权

评论回复
地板
uet_cache| | 2013-2-4 19:49 | 只看该作者
模拟的我没出过问题,好用的很,也不会因引脚复用其它功能而出问题。。

使用特权

评论回复
5
zhl100| | 2013-2-5 11:09 | 只看该作者

void i2c_initial(void)
{

        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
       
        /*SCL:PB6 */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//GPIO_Mode_Out_PP;                //模拟IIC 将模式由GPIO_Mode_AF_OD 改为 GPIO_Mode_Out_OD;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        /*SDA :PB7*/
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;                       
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;          //模拟IIC 将模式由GPIO_Mode_AF_OD 改为 GPIO_Mode_Out_OD;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       

}

static void i2c_start(void)
{
        SDA_H;
        delay_us(20);
        SCL_H;       
        delay_us(20);
        SDA_L;
        delay_us(20);
        SCL_L;       
        delay_us(20);
}

static void i2c_stop(void)
{
        SDA_L;                              //发送结束条件的数据信号
        delay_us(20);
        SCL_H;                              //结束条件建立时间大于4μs
        delay_us(20);
        SDA_H;                              //发送I2C总线结束信号
        delay_us(20);
}

static u8 i2c_get_ack(void)
{       
        u16 timeout = 255;
        SCL_H;
        delay_us(15);
        while(SDA_R == 1)
        {
                timeout--;
                if(timeout == 0)
                {
                        i2c_stop();                       
                        return 1;
                }
                delay_us(10);
        }
        SCL_L;
        delay_us(15);
        return 0;
}
/*
static void i2c_tack(u8 tack)
{
        tack? SDA_H : SDA_L;
        delay_us(5);  
        SCL_H;
        delay_us(15);
        SCL_L;
        delay_us(15);
}
*/
static void i2c_send_byte(u8 data)
{
        u8 i;
        SCL_L;
        delay_us(15);
        for(i=0;i<8;i++)   // Get MSB Bit
        {
                if(((data << i)&0x80) != 0)
                        SDA_H;                       
                else
                        SDA_L;
                delay_us(5);
                SCL_H;     // Start Send Data
                delay_us(15);       
                SCL_L;    // Prepare for Sending Next Bit
                delay_us(15);       
        }
}
static u8 i2c_receive_byte()
{
        u8 data = 0;
        u8 i;

        for (i=0;i<8;i++)   // 8-bits
        {
                SCL_L;
                delay_us(15);
                SCL_H;                  
                delay_us(15);
                data<<=1;
                if (SDA_R == 1)
                        data |= 0x01;               
        }
        SCL_L;
        delay_us(15);
        return data;
}

使用特权

评论回复
6
zhl100| | 2013-2-5 11:11 | 只看该作者
这么用,没问题的:lol

使用特权

评论回复
7
sunnyhey|  楼主 | 2013-2-8 10:02 | 只看该作者
zhl100 发表于 2013-2-5 11:09
void i2c_initial(void)
{

你的方法确实很简单,我也是用模拟的,控制PCF8574T,现在可以发送数据了,但是读数据不对,而且和UART2一起用的话会有冲突,对USART2收发数据都有影响,不知道为什么,用STM自带的I2C发送都不行,但是读写M24C02可以。:P

使用特权

评论回复
8
sunnyhey|  楼主 | 2013-2-8 10:06 | 只看该作者
uet_cache 发表于 2013-2-4 19:49
模拟的我没出过问题,好用的很,也不会因引脚复用其它功能而出问题。。

模拟的是很好用,但是对USART2有影响啊,本来可以收发数据的,现在不行了。

使用特权

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

本版积分规则

3

主题

46

帖子

1

粉丝