LPC1788--I2C設置驅動PCF8574 與特別注意事項
簡單記錄LPC1788學習過程的寄存器操作---I2C學習
寄存器的直接操作可以比較直觀學習,深入了解芯片功能!
特別注意事項:如果使用I2C0的P0_27與P0_28時一定要加外部上拉電阻!
#include "i2c_lpc1788.h"
/*------------I2C0初始化-------------*/
void I2C0_Init(uint32_t clk, uint32_t clockrate)
{
uint32_t temp;
LPC_IOCON->P0_27=0x21;
LPC_IOCON->P0_28=0x21;//配置IO
LPC_SC->PCONP "=(1<<7);//I2C0外設時鐘開啟
temp=clk/clockrate;//時鐘頻率分頻寄存器
LPC_I2C0->SCLH=(uint32_t)(temp/2);
LPC_I2C0->SCLL=(uint32_t)(temp-LPC_I2C0->SCLH);
LPC_I2C0->CONCLR=(1<<2)|(1<<5)|(1<<6);//清標志位
LPC_I2C0->CONSET=(1<<6); //使能I2C0主模式
}
/*------------發(fā)送起始信號------------*/
void I2C0_Start(void)
{
uint32_t i=2000;
LPC_I2C0->CONSET=(1<<5); //發(fā)送起始信號
while((LPC_I2C0->STAT !=0x08)&&(i--)); //等待返回狀態(tài)
LPC_I2C0->CONCLR=(1<<5); //清除發(fā)送標識
}
/*------------發(fā)送停止信號-----------*/
void I2C0_Stop(void)
{
LPC_I2C0->CONSET=(1<<4); //發(fā)送停止信號
LPC_I2C0->CONCLR=(1<<3); //復位SI信號
}
/*------------寫8位數(shù)據(jù)----------*/
void I2C0_WriteByte(uint8_t data)
{
LPC_I2C0->DAT=data;//寫數(shù)據(jù)
LPC_I2C0->CONCLR=(1<<3); //數(shù)據(jù)載入后復位SI信號
}
/*------------寫地址與讀寫模式-----------*/
void I2C0_WriteAddr(uint8_t addr,uint8_t rORw)
{
uint32_t i=2000;
I2C0_WriteByte(addr + rORw); //后一位標識讀或者寫
if(rORw==1)while((LPC_I2C0->STAT!=0x40)&&(i--)); //讀-返回狀態(tài)
elsewhile((LPC_I2C0->STAT!=0x18)&&(i--));//寫-返回狀態(tài)
}
/*------------寫數(shù)據(jù)-----------*/
void I2C0_WriteData(uint8_t data)
{
uint32_t i=2000;
I2C0_WriteByte(data);
while((LPC_I2C0->STAT!=0x28)&&(i--)); //數(shù)據(jù)寫完成返回狀態(tài)
}
/*------------讀8位數(shù)據(jù)-----------*/
uint8_t I2C0_ReadByte(uint8_t last)
{
uint32_t i=2000;
if(last) //讀最后一位數(shù)據(jù)
{
LPC_I2C0->CONCLR=(1<<2)|(1<<3);
while((LPC_I2C0->STAT!=0x58)&&(i--));
}
else
{
i=2000;
LPC_I2C0->CONCLR=(1<<2)|(1<<3);
while((LPC_I2C0->STAT!=0x50)&&(i--));
}
return LPC_I2C0->DAT;//數(shù)據(jù)讀
}
/*------------控制PCF8574-----------*/
void WritePCF8574(uint8_t addr,uint8_t pBuffer)
{
I2C0_Start();
I2C0_WriteAddr(addr,0); //寫地址-寫模式
I2C0_WriteData(pBuffer); //寫數(shù)據(jù)
I2C0_Stop();
}