注册会员
- 积分
- 39
- 威望
- 21
- 贡献
- 10
- 兑换币
- 9
- 注册时间
- 2015-5-1
- 在线时间
- 4 小时
- 毕业学校
- 欧力哦小学
|
本帖最后由 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();
}
}
|
|