一.硬件I2c
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”来取消其复位,才可以正常操作。
SYSCON->PRESETCTRL |= (1<<1); //对第一位写1,取消复位
IOCON->PIO0_4 &= ~0x3F;
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; // 发送停止信号
}
#define I2CONCLR_SIC (1<<3) // 清I2C中断标志位
I2C->CONCLR = (1<<3)
SIC 是 I2C 中断清除位。在 CONSET 寄存器中写 1 将清除 SI 位,写 0 无效。
I2C->CONSET |= I2CONSET_STO; // 发送停止信号
#define I2CONSET_STO(1<<4) // 停止标志位