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主模式

}
/*------------发送起始信号------------*/
void I2C0_Start(void)

{

    uint32_t i=2000;

    LPC_I2C0->CONSET=(1<<5);   //发送起始信号
    while((LPC_I2C0->STAT !=0x08)&&(i--));  //等待返回状态
    LPC_I2C0->CONCLR=(1<<5);  //清除发送标识
}
/*------------发送停止信号-----------*/
void I2C0_Stop(void)
{
    LPC_I2C0->CONSET=(1<<4);   //发送停止信号
    LPC_I2C0->CONCLR=(1<<3);   //复位SI信号
}
/*------------写8位数据----------*/
void I2C0_WriteByte(uint8_t data)
{
    LPC_I2C0->DAT=data;//写数据
    LPC_I2C0->CONCLR=(1<<3); //数据载入后复位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--));  //读-返回状态
    elsewhile((LPC_I2C0->STAT!=0x18)&&(i--));//写-返回状态
}
/*------------写数据-----------*/
void I2C0_WriteData(uint8_t data)

{

    uint32_t i=2000;

    I2C0_WriteByte(data);
    while((LPC_I2C0->STAT!=0x28)&&(i--)); //数据写完成返回状态
}
/*------------读8位数据-----------*/
uint8_t I2C0_ReadByte(uint8_t last)

{

    uint32_t i=2000;

    if(last) //读最后一位数据

    {

        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;//数据读
}
/*------------控制PCF8574-----------*/
void WritePCF8574(uint8_t addr,uint8_t  pBuffer)
{
    I2C0_Start();
    I2C0_WriteAddr(addr,0); //写地址-写模式
    I2C0_WriteData(pBuffer); //写数据
    I2C0_Stop();

}





  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值