注册 登录
查看: 650|回复: 5

k60 I2C的问题

[复制链接]
发表于 2014-7-22 11:37:57 | 显示全部楼层 |阅读模式
我用 的I2C 库 返回的数据全部是FF。。。不晓得是不是库的问题呢,版本好像是12年的,求指教。。。u8 I2C_ReadAddr(I2Cn i2cn, u8 SlaveID, u8 Addr)
{
    u8 result;
    /* Send Slave Address */
    I2C_StartTransmission (i2cn, SlaveID, MWSR);
    i2c_Wait(i2cn);
    /* Write Register Address */
    i2c_write_byte(i2cn, Addr);
    i2c_Wait(i2cn);
    /* Do a repeated start */
    i2c_RepeatedStart(i2cn);
    /* Send Slave Address */
    i2c_write_byte(i2cn, ( SlaveID << 1) | MRSW );
    i2c_Wait(i2cn);
    /* Put in Rx Mode */
    i2c_PutinRxMode(i2cn);
    /* Turn off ACK since this is second to last byte being read*/
    i2c_DisableAck(i2cn); //不应答
    /* Dummy read 虚假读取*/
    result = I2C_D_REG(I2Cx[i2cn]);
    i2c_Wait(i2cn);
    /* Send stop since about to read last byte */
    i2c_Stop(i2cn);
    /* Read byte */
    result = I2C_D_REG(I2Cx[i2cn]);
    return result;
}

/*************************************************************************
*                             山外嵌入式开发工作室
*
*  函数名称:I2C_WriteAddr
*  功能说明:写入一个字节数据到I2C设备指定寄存器地址
*  参数说明:I2Cn        模块号(I2C0、I2C1)
*            SlaveID     7位从机地址
*            Addr        从机的寄存器地址
*            Data        数据
*  函数返回:无
*  修改时间:2012-1-20
*  备    注:
*************************************************************************/
void I2C_WriteAddr(I2Cn i2cn, u8 SlaveID, u8 Addr, u8 Data)
{
    /* send data to slave */
    I2C_StartTransmission(i2cn, SlaveID, MWSR);    //启动传输
    i2c_Wait(i2cn);
    i2c_write_byte(i2cn, Addr);                    //写地址
    i2c_Wait(i2cn);
    i2c_write_byte(i2cn, Data);                    //写数据
    i2c_Wait(i2cn);
    i2c_Stop(i2cn);
    Pause();                                        //延时太短的话,可能写出错
}
*************************************************************************
*                             山外嵌入式开发工作室
*
*  函数名称:I2C_init
*  功能说明:I2C初始化,设置波特率和启动I2C
*  参数说明:I2Cn        模块号(I2C0、I2C1)
*  函数返回:无
*  修改时间:2012-1-20
*  备    注:
*************************************************************************/
void I2C_init(I2Cn i2cn)
{
    u8 mult;
    if(bus_clk_khz <= 50000)mult = 0;         //bus 一分频
    else  if(bus_clk_khz <= 100000)mult = 1;  //bus 二分频
    else      mult = 2;                       //bus 四分频
    if(i2cn == I2C0)
    {
        /* 开启时钟 */
        SIM_SCGC4 |= SIM_SCGC4_I2C0_MASK;         //开启 I2C0时钟
        /* 配置 I2C0功能的 GPIO 接口 */
        if(I2C0_SCL == PTB0)
            PORTB_PCR0 = PORT_PCR_MUX(2);
        else if(I2C0_SCL == PTB2)
            PORTB_PCR2 = PORT_PCR_MUX(2);
        else if(I2C0_SCL == PTD8)
            PORTD_PCR8 = PORT_PCR_MUX(2);
        else
            assert_failed(__FILE__, __LINE__);                   //设置管脚有误?
        if(I2C0_SDA == PTB1)
            PORTB_PCR1 = PORT_PCR_MUX(2);
        else if(I2C0_SDA == PTB3)
            PORTB_PCR3 = PORT_PCR_MUX(2);
        else if(I2C0_SDA == PTD9)
            PORTD_PCR9 = PORT_PCR_MUX(2);
        else
            assert_failed(__FILE__, __LINE__);                   //设置管脚有误?
    }
    else
    {
        /* 开启时钟 */
        SIM_SCGC4 |= SIM_SCGC4_I2C1_MASK;         //开启 I2C1时钟
        /* 配置 I2C1功能的 GPIO 接口 */
        if(I2C1_SCL == PTE1)
            PORTE_PCR1 = PORT_PCR_MUX(6);
        else if(I2C1_SCL == PTC10)
            PORTC_PCR10 = PORT_PCR_MUX(2);
        else
            assert_failed(__FILE__, __LINE__);                   //设置管脚有误?
        if(I2C1_SDA == PTE0)
            PORTE_PCR0 = PORT_PCR_MUX(6);
        else if (I2C1_SDA == PTC11)
            PORTC_PCR11 = PORT_PCR_MUX(2);
        else
            assert_failed(__FILE__, __LINE__);                   //设置管脚有误?
    }
    /* 设置频率 */
    I2C_F_REG(I2Cx[i2cn])  = I2C_F_MULT(mult) | I2C_F_ICR(17) ;  // I2C Frequency Divider register (I2Cx_F)  I2C分频寄存器   I2C最大波特率为 400k
    // MULT=00  即  mul = 1
    // ICR =14  ICR为Clock rate时钟频率
    // 从《k16 reference manual.pdf》P1460 可得:
    // ICR    SCL Divider   SDA Hold Value    SCL Hold (Start) Value    SCL Hold (Stop) Value
    //  14        80              17                   34                         41
    //  17       128              21                   58                         65
    // I2C baud rate = bus speed (Hz)/(mul × SCL divider)  即这里 50MHz/(1 ×128)=390.625kHz
    // SDA hold time = bus period (s) × mul × SDA hold value
    // SCL start hold time = bus period (s) × mul × SCL start hold value
    // SCL stop hold time = bus period (s) × mul × SCL stop hold value
    /* 使能 IIC1 */
    I2C_C1_REG(I2Cx[i2cn]) = I2C_C1_IICEN_MASK;
}
回复

使用道具 举报

 楼主| 发表于 2014-7-22 11:40:24 | 显示全部楼层
有莫有人啊。。问题很急啊,,都弄两天了。。。读写FM31256 老是返回的是FF
回复 支持 反对

使用道具 举报

发表于 2014-7-22 11:41:48 | 显示全部楼层
看看你的硬件外设电路是不是正常了~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-22 11:42:26 | 显示全部楼层
:Q
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-22 12:01:32 | 显示全部楼层
仰平心 发表于 2014-7-22 11:41
看看你的硬件外设电路是不是正常了~

外设是正常的哇。。。而且用示波器能看到有信号、、、
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-22 12:21:42 | 显示全部楼层
这个I2C 库是不是有Bug呢
回复 支持 反对

使用道具 举报

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

本版积分规则

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