智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1724|回复: 3
打印 上一主题 下一主题

[Kinetis ARM微控制器] KL05读取加速度传感器i2c老是停止在等待I2C标志的问题

[复制链接]

1

主题

3

帖子

0

精华

注册会员

Rank: 2

积分
39
威望
21
贡献
10
兑换币
9
注册时间
2015-5-1
在线时间
4 小时
毕业学校
欧力哦小学
跳转到指定楼层
1#
发表于 2015-5-2 19:39:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ILOSTID 于 2015-5-2 19:42 编辑

KL05读取加速度传感器i2c老是停止在等待I2C标志的问题:
因为项目需要,特地从淘宝买了一块FRDM-KL05开发板进行先行测试,需要用到I2C模块,从官方下载开发板相关的例程,通过KEIL仿真时发现对加速度传感器进行读取时老是停止在等待标志置位,通过百度搜索发现飞思卡尔芯片的I2C的确有些许问题,也看过它的勘误表,按照勘误表描述进行修改,但该问题仍存在,郁闷了一整天,无从下手了,望大家能给点建议,先谢谢了,程序代码如下:
//I2C驱动部分
void i2c_set_tx_mode(I2C_MemMapPtr p)
{
    p->C1 |= I2C_C1_TX_MASK;

}
void i2c_set_rx_mode(I2C_MemMapPtr p)
{
    p->C1 &= ~I2C_C1_TX_MASK;
}

void i2c_set_slave_mode(I2C_MemMapPtr p)
{
    p->C1  &= ~I2C_C1_MST_MASK;
}
void i2c_set_master_mode(I2C_MemMapPtr p)
{
    p->C1  |=  I2C_C1_MST_MASK;
}

// i2c general

void i2c_give_nack(I2C_MemMapPtr p)
{
    p->C1 |= I2C_C1_TXAK_MASK;
}
void i2c_give_ack(I2C_MemMapPtr p)
{
    p->C1 &= ~I2C_C1_TXAK_MASK;
}
void i2c_repeated_start(I2C_MemMapPtr p)
{
    p->C1     |= 0x04;
}
void i2c_write_byte(I2C_MemMapPtr p, uint8 data)
{
    p->D = data;
}
uint8 i2c_read_byte(I2C_MemMapPtr p)
{
    return p->D;
}
void i2c_start(I2C_MemMapPtr p)
{
    i2c_set_master_mode(p);
    i2c_set_tx_mode(p);
}
void i2c_stop(I2C_MemMapPtr p)
{
    i2c_set_slave_mode(p);
    i2c_set_rx_mode(p);
}
void i2c_wait(I2C_MemMapPtr p)
{
    // wait flag
    while((p->S & I2C_S_IICIF_MASK)==0)   //测试时老是停止在该位置
        ;

    // clear flag
    p->S |= I2C_S_IICIF_MASK;
}
uint16 i2c_get_ack(I2C_MemMapPtr p)
{
    if((p->S & I2C_S_RXAK_MASK) == 0)
        return TRUE;
    else
        return FALSE;
}

// -------------------------------------------------
void hal_i2c_init(I2C_MemMapPtr p)
{
   // SIM_SCGC4 |= SIM_SCGC4_I2C1_MASK;

   SIM_SCGC4 |= SIM_SCGC4_I2C0_MASK;
   
      // configure GPIO for I2C function
    PORTB_PCR3 = PORT_PCR_MUX(2);
    PORTB_PCR4 = PORT_PCR_MUX(2);


   
    p->F  = 0x20; // baudrate 测试时根据勘误,将该值设置为0,问题仍然没解决
    p->C1 = 0x80; // enable IIC
}

void hal_i2c_deinit(I2C_MemMapPtr p)
{
    p->C1 = 0x00;
   
    SIM_SCGC4 &= ~SIM_SCGC4_I2C0_MASK;
}
//MMA8451 部分
#define MMA8451_I2C_ADDRESS (0x1d<<1)
#define I2C0_B  I2C0_BASE_PTR

void hal_dev_mma8451_init(void)
{
  hal_i2c_init(I2C0_B);
}


void hal_dev_hmc5883l_init(void)
{
    hal_i2c_init(I2C0_B);
}

// this delay is very important, it may cause w-r operation failure.
static void pause(void)
{
    int n;
    for(n=0; n<40; n++);
//    asm("nop");
}
uint8 hal_dev_mma8451_read_reg(uint8 addr)
{
    uint8 result;

    i2c_start(I2C0_B);
    i2c_write_byte(I2C0_B, MMA8451_I2C_ADDRESS | I2C_WRITE);
   
    i2c_wait(I2C0_B);
    i2c_get_ack(I2C0_B);

    i2c_write_byte(I2C0_B, addr);
    i2c_wait(I2C0_B);
    i2c_get_ack(I2C0_B);

    i2c_repeated_start(I2C0_B);
    i2c_write_byte(I2C0_B, MMA8451_I2C_ADDRESS | I2C_READ);
    i2c_wait(I2C0_B);
    i2c_get_ack(I2C0_B);

    i2c_set_rx_mode(I2C0_B);

    i2c_give_nack(I2C0_B);
    result = i2c_read_byte(I2C0_B);
    i2c_wait(I2C0_B);

    i2c_stop(I2C0_B);
    result = i2c_read_byte(I2C0_B);
    pause();
    return result;
}

void hal_dev_mma8451_write_reg(uint8 addr, uint8 data)
{
    i2c_start(I2C0_B);

    i2c_write_byte(I2C0_B, HMC5883L_SLAVE_WRITE_ADDR|I2C_WRITE);
    i2c_wait(I2C0_B);
    i2c_get_ack(I2C0_B);

    i2c_write_byte(I2C0_B, addr);
    i2c_wait(I2C0_B);
    i2c_get_ack(I2C0_B);

    i2c_write_byte(I2C0_B, data);
    i2c_wait(I2C0_B);
    i2c_get_ack(I2C0_B);

    i2c_stop(I2C0_B);
    pause();
}
//MAIN函数部分
int main (void)
{
#if(defined(CW))
    sysinit();
#endif
    accel_init();
    while(1)
    {
        hal_dev_mma8451_test_function();
    }
}
回复

使用道具 举报

1

主题

3

帖子

0

精华

注册会员

Rank: 2

积分
39
威望
21
贡献
10
兑换币
9
注册时间
2015-5-1
在线时间
4 小时
毕业学校
欧力哦小学
2#
 楼主| 发表于 2015-5-2 21:04:54 | 只看该作者
原来论坛上这么多人问I2C的问题,看来飞思卡尔的cortex M的I2C还真问题挺多的,但没看到有一个统一的解决方案,写思路清晰的网友指点下,谢谢!
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

注册会员

Rank: 2

积分
39
威望
21
贡献
10
兑换币
9
注册时间
2015-5-1
在线时间
4 小时
毕业学校
欧力哦小学
3#
 楼主| 发表于 2015-5-2 21:47:15 | 只看该作者
可以读了,设置I2C引脚时加个上拉可以了。
希望对以后的朋友有帮助!
回复 支持 反对

使用道具 举报

5

主题

361

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3395
威望
1687
贡献
1136
兑换币
1068
注册时间
2014-1-15
在线时间
286 小时
毕业学校
sdu
4#
发表于 2015-5-3 11:54:57 | 只看该作者
ILOSTID 发表于 2015-5-2 21:47
可以读了,设置I2C引脚时加个上拉可以了。
希望对以后的朋友有帮助!

库确实不是很好,上拉是必须的,最好还是稍微改下库。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-26 03:18 , Processed in 0.173360 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表