LPC1114 -I2C

一.硬件I2c

LPC1114 -I2C_第1张图片

SDA 和 SCL 都是双向线路。连接到总线的器件的输出级必须是漏极开路或集电极开路,都通过一个电流源或上拉电阻连接到正的电源电压,这样才能够实现“线与”功能。当总线空闲时,这 2 条线路都是高电平。

/*******************************************************************************
Function: I2C_Init 
Description: 硬件I2C初始化
Input:   Mode :0 , 慢速模式   1 , 快速模式
Output: 无
Return: 无
*******************************************************************************/
void I2C_Init(uint8_t Mode) 
{
    SYSCON->PRESETCTRL |= (1<<1);      // De-asserted I2C模块(在启动I2C模块之前,必须向该位写1)
    SYSCON->SYSAHBCLKCTRL |= (1<<5);   // 使能I2C时钟
    SYSCON->SYSAHBCLKCTRL |= (1<<16);  // 使能IOCON时钟
    IOCON->PIO0_4 &= ~0x3F;        
    IOCON->PIO0_4 |= 0x01;              // 把P0.4脚配置为 I2C SCL 
    IOCON->PIO0_5 &= ~0x3F;    
    IOCON->PIO0_5 |= 0x01;              // 把P0.5脚配置为 I2C SDA 
    SYSCON->SYSAHBCLKCTRL |= (1<<16);   // 禁能IOCON时钟 
    if(Mode == 1)                        // 快速I2C通信 (大约400KHz传输速率)(AT24C02支持400K快速模式)
    {
        I2C->SCLH = 47;                  // 0.8us
        I2C->SCLL = 93;                  // 1.4us
    }
    else                                 // 低速I2C通信     (大约100KHz传输速率)
    {
        I2C->SCLH = 47*4;                // 3.2us
        I2C->SCLL = 93*4;                // 5.6us
     }
       I2C->CONCLR = 0xFF;               // 清所有标志
       I2C->CONSET |= I2CONSET_I2EN;     // 使能I2C接口
}
  • PRESETCTRL

注:在使用 SSP 和 I2C 前必须在相应的复位控制位写“1”来取消其复位,才可以正常操作。

LPC1114 -I2C_第2张图片

SYSCON->PRESETCTRL |= (1<<1); //对第一位写1,取消复位

  • IOCON->PIO0_4 &= ~0x3F;

LPC1114 -I2C_第3张图片

0x3F:0011 1111

~0x3F: 1100 0000

PIO0_4: 0100 0000 0000 0100 0100 0000 0011 0000

/*******************************************************************************
Function: I2C_stop 
Description: 发送停止信号
Input:  无               
Output: 无
Return: 无
*******************************************************************************/
void I2C_Stop(void)
{
   I2C->CONCLR = I2CONCLR_SIC;      // 清SI标志位
   I2C->CONSET |= I2CONSET_STO;     // 发送停止信号
}
LPC1114 -I2C_第4张图片
  • #define I2CONCLR_SIC (1<<3) // 清I2C中断标志位

I2C->CONCLR = (1<<3)

SIC 是 I2C 中断清除位。在 CONSET 寄存器中写 1 将清除 SI 位,写 0 无效。

  • I2C->CONSET |= I2CONSET_STO; // 发送停止信号

LPC1114 -I2C_第5张图片

#define I2CONSET_STO(1<<4) // 停止标志位

你可能感兴趣的:(单片机)