LPC800 开发板 I2C 的使能问题。

2019-03-25 20:22发布

我把周立功的LPC800例子里面的I2C中的I2C_EEPROM的程序改了一下,还是无法运行,请帮忙看一下。

void I2CInit (void)
{
    //原始程序用的最适宜做I2C的口,小板上没有   
    //LPC_IOCON->PIO0_10  &= ~(0x3 << 8);                                 /* 引脚属性                     */
    //LPC_IOCON->PIO0_10  |=  (0x2 << 8);                                 /* 使能I2C_SDA 增强快速模式     */
    //LPC_IOCON->PIO0_11  &= ~(0x3 << 8);
    //LPC_IOCON->PIO0_11  |=  (0x2 << 8);                                 /* 使能I2C_SCL 增强快速模式     */
   
                /* Pin Assign 8 bit Configuration */
    /* I2C0_SDA */
    LPC_SWM->PINASSIGN7 = 0x00ffffffUL;                                  /* I2C_SDA ~ P0.0              */
                LPC_IOCON->PIO0_0 |= (0x3 << 3); //我按照手册把下拉电阻关了
                LPC_IOCON->PIO0_0 |= (1 << 10);
    /* I2C0_SCL */
    LPC_SWM->PINASSIGN8 = 0xffffff01UL;                                  /* I2C_SCL ~ P0.1              */
                LPC_IOCON->PIO0_1 |= (0x3 << 3);
                LPC_IOCON->PIO0_1 |= (1 << 10);
       
    //LPC_SWM->PINASSIGN7 &= ~(0xFFUL << 24);                             /* 管脚分配                     */
    //LPC_SWM->PINASSIGN7 |=  (10 << 24);                                 /* I2C_SDA ~ P0.10              */
    //LPC_SWM->PINASSIGN8 &= ~(0xFF << 0);
    //LPC_SWM->PINASSIGN8 |=  (11 << 0);                                  /* I2C_SCL ~ P0.11              */
   
    /*
     * 时钟换算关系:       I2C_Pclk   = MAIN_CLK / SYSAHBCLKDIV;
     *                      I2C_Fclk   = I2C_Pclk / DIVVAL;
     *                      I2C_SCLclk = I2C_Fclk / (MSTSCLLOW + MSTSCLHIGH + 4);
     *
     * 系统时钟:           MAIN_CLK   = 24 MHz,    SYSAHBCLKDIV = 1;
     * I2C增强快速模式:    I2C_SCLclk = 400 kHz;
     
     * CAT24C02要求:       I2C_Fclk    = 8 * I2C_SCLclk = 3.2 MHz, MSTSCLLOW = 2, MSTSCLHIGH = 0;
     *                      DIVVAL      = I2C_Pclk / I2C_Fclk - 1= 24 / 3.2 - 1 = 7;
     */
                LPC_SYSCON->PRESETCTRL |= (1 << 6);
    LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 5);                              /* 初始化I2C AHB时钟            */
    LPC_I2C->DIV      = 7;
    LPC_I2C->MSTTIME |= (0 << 0) | (0 << 4); //不知道为什么原始程序用的是(2<<0),我安装手册改成了(0<<0)
                           /* SCL_LOW = SCL_HIGH = 2 * CLK */
    LPC_I2C->CFG     |= (1 << 0) | (0 << 3);                            /* 使能主机模式,禁止超时       */
}

程序无法运行,我把引脚连到一个LED灯上,板子RESET之后灯没有闪烁,感觉没有输出。
麻烦看一下问题出在什么地方,谢谢。 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
hizzx
1楼-- · 2019-03-27 00:50
可以用了。
我把
P01定义为SDA。
P03定义为SCL。
我还没有逻辑分析仪,所有加了几个串口通信作为Debug用,IIC用的是一个24C02,所写的数据是LED的数据,可以用单片机再显示在LED上。

感觉最重要的是在写动作里面加几个延时,还有我感觉写的for循环逻辑上多了一个减一。
我可能没有把RESET键,所以需要用开关电源复位。

[ 本帖最后由 hizzx 于 2013-9-5 09:11 编辑 ]
alchimy
2楼-- · 2019-03-27 02:45
多谢大大指点,这是一个很好的例子
hizzx
3楼-- · 2019-03-27 08:05
我要有零花钱就买个调试器了,就不加串口了。不知道论坛搞活动不。

一周热门 更多>