PAGE1
PAGE1
LPC1114I2C和SPI通信
I2C通信
I2C通信原理
I2C(Inter-IntegratedCircuit)是一种简单、双向、二线制的同步串行通信协议,常用于连接多个低速外围设备。LPC1114内置了I2C接口,支持主模式和从模式通信。I2C通信使用两条线:SCL(SerialClockLine)和SDA(SerialDataLine)。SCL是时钟线,由主设备控制,SDA是数据线,用于传输数据。
I2C通信的基本特性包括:
多主设备和多从设备支持
7位或10位从设备地址
100kbps、400kbps和1Mbps标准传输速率
简单的硬件实现
初始化I2C
在LPC1114上初始化I2C接口需要配置相关的寄存器。以下是一个基本的初始化示例:
#includeLPC11xx.h
voidI2C_Init(void){
//使能I2C模块时钟
LPC_SYSCON-SYSAHBCLKCTRL|=(127);//I2C时钟使能
//配置I2C引脚
LPC_PINCON-PINSEL1=~(0x312);//清除I2C1SCL引脚功能
LPC_PINCON-PINSEL1|=(0x212);//设置I2C1SCL引脚功能
LPC_PINCON-PINSEL1=~(0x314);//清除I2C1SDA引脚功能
LPC_PINCON-PINSEL1|=(0x214);//设置I2C1SDA引脚功能
//配置I2C传输速率
LPC_I2C1-I2CONSET=0x48;//使能I2C,设置标准模式
LPC_I2C1-I2CONCLK=0x00;//设置时钟分频
LPC_I2C1-I2FS=0x01;//设置SCL频率为100kbps
//使能I2C
LPC_I2C1-I2CONSET=(16);//使能I2C
}
发送数据
使用I2C发送数据需要设置主模式,并通过I2C_MasterSend函数实现。以下是一个发送数据的示例:
voidI2C_MasterSend(uint8_tslave_addr,uint8_t*data,uint32_tlength){
uint32_ti;
//发送起始信号
LPC_I2C1-I2CONSET=(18);//发送起始信号
while(LPC_I2C1-I2STAT!=0x08){}//等待起始信号发送完成
//发送从设备地址和写操作
LPC_I2C1-I2DAT=(slave_addr1)|0;//写操作
while(LPC_I2C1-I2STAT!=0x18){}//等待地址发送完成
//发送数据
for(i=0;ilength;i++){
LPC_I2C1-I2DAT=data[i];//发送数据
while(LPC_I2C1-I2STAT!=0x28){}//等待数据发送完成
}
//发送停止信号
LPC_I2C1-I2CONCLR=(17);//清除ACK
LPC_I2C1-I2CONSET=(19);//发送停止信号
while(LPC_I2C1-I2STAT!=0x50){}//等待停止信号发送完成
}
接收数据
使用I2C接收数据需要设置主模式,并通过I2C_MasterReceive函数实现。以下是一个接收数据的示例:
voidI2C_MasterReceive(uint8_tslave_addr,uint8_t*data,uint32_tlength){
uint32_ti;
//发送起始信号
LPC_I2C1-I2CONSET=(18);//发送起始信号
while(LPC_I2C1-I2STAT!=0x08){}//等待起始信号发送完成
//发送从设备地址和读操作
LPC