LPC1788的IIC使用

发布者:王岚枫最新更新时间:2021-08-25 来源: eefocus关键字:LPC1788  IIC使用 手机看文章 扫描二维码
随时随地手机看文章

#ifndef __IIC0_H_

#define __IIC0_H_

#include "common.h"

#include "delay.h"

//IIC通讯过程中的指定状态

#define STATUS_SENDSTART 0X08 //已经发送起始条件

#define STATUS_REPEATSTART 0X10 //已经发送重复的起始条件

#define STATUS_SENDSLAVE_ACK 0X18 //已发送从机写地址,接收到ACK

#define STATUS_SENDSLAVE_NACK 0X20 //已发送从机写地址,未接收到ack

#define STATUS_SENDDATA_ACK 0X28 //已发送从机写数据,并接收到ack

#define STATUS_SENDDATA_NACK 0X30 //已发送从机写数据没收到ack

#define STATUS_LOSS 0X38 //丢失总线仲裁

#define STATUS_READADDR_NACK 0X48 //已经发送从机读地址未收到ack

#define STATUS_READADDR_ACK 0X40 //已发送从机读地址并接受到ack

#define STATUS_RECV_ACK 0X50 //已接受数据字节ack已返回

#define STATUS_RECV_NACK 0X58 //已接受数据字节nack已返回

void iic0_init(u16 div);//参数为时钟分频数 不得超过65535 + 65535

u8 iic0_start(void);//发送起始信号

u8 iic0_send_write_addr(u8 addr);//发送设备写地址

u8 iic0_send_data(u8 data);//发送数据

u8 iic0_send_stop(void);//发送停止

u8 iic0_send_read_addr(u8 addr);//发送读地址

u8 iic0_read_data(u8* value,u8 ack);//读取数据

u8 iic0_repeat_start(void);//重新发送start

#endif

#include "iic0.h"

#define I2EN 6 //接口使能

#define STA 5 //起始标志

#define STO 4 //停止标志

#define SI 3 //中断标志

#define AA 2 //应答标志

#define I2ENC 6 //清除iic使能

#define STAC 5 //清除起始

#define SIC 3 //清除中断

#define AAC 2 //清除应答

#define STATE (LPC_I2C0->STAT & 0xf8) //IIC总线的实际状态信息

void iic0_init(u16 div)

{

//打开时钟,同时打开iic和gpio时钟

LPC_SC->PCONP |= (1<<15)|(1<<7);//打开时钟

//配置引脚功能

LPC_IOCON->P0_27 = 0x00;

LPC_IOCON->P0_27 |= (1<<0)|(1<<8);//打开iic功能,禁止滤波器 与引脚配置相关 根据实际引脚进行修改

LPC_IOCON->P0_28 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽

LPC_IOCON->P0_28 |= (1<<0)|(1<<8);//打开iic功能,禁止滤波器 与引脚配置相关 根据实际引脚进行修改

LPC_I2C0->CONCLR |= (1<LPC_I2C0->CONCLR |= (1<LPC_I2C0->SCLH = div/2;//设置IIC时钟

LPC_I2C0->SCLL = div/2;

LPC_I2C0->CONSET |= (1<}

//等待指定的状态

//失败返回1 成功返回0

static u8 WaitResponse(u8 response)

{

u8 retry = 200;

while(--retry)

{

DelayUs(1);

if(STATE == response)break;

}

if(retry)return 0;

else

{

iic0_send_stop();

return 1;

}

}

u8 iic0_start(void)//发送起始信号

{

LPC_I2C0->CONCLR = (1<//Start

LPC_I2C0->CONSET = (1<寄存器达到指定状态

return WaitResponse(STATUS_SENDSTART);//等待起始条件发送成功

}

u8 iic0_send_write_addr(u8 addr) //发送设备写地址

{

//dev_addr

LPC_I2C0->DAT = addr;

LPC_I2C0->CONSET = (1<LPC_I2C0->CONCLR = (1<return WaitResponse(STATUS_SENDSLAVE_ACK);//等待设备ack

}

u8 iic0_send_data(u8 data) //发送数据

{

LPC_I2C0->DAT = data;

LPC_I2C0->CONSET = (1<LPC_I2C0->CONCLR = (1<return WaitResponse(STATUS_SENDDATA_ACK);

}

u8 iic0_send_stop(void) //发送停止

{

LPC_I2C0->CONCLR = (1<LPC_I2C0->CONSET = (1<LPC_I2C0->CONCLR = (1<return 0;

}

u8 iic0_send_read_addr(u8 addr) //发送读地址

{

LPC_I2C0->DAT = addr;

LPC_I2C0->CONSET = (1<LPC_I2C0->CONCLR = (1<return WaitResponse(STATUS_READADDR_ACK);

}

u8 iic0_read_data(u8* value,u8 ack) //读取数据 1发送ack 0不发送

{

if(ack)

{

LPC_I2C0->CONSET = (1<LPC_I2C0->CONCLR = (1<if( WaitResponse(STATUS_RECV_ACK))return 1;

}

else

{

LPC_I2C0->CONCLR = (1<if(WaitResponse(STATUS_RECV_NACK))return 1;

}

*value = LPC_I2C0->DAT;

return 0;

}

u8 iic0_repeat_start(void) //重新发送start

{

LPC_I2C0->CONCLR = (1<LPC_I2C0->CONSET = (1<return WaitResponse(STATUS_REPEATSTART);//等待重复start成功

}


关键字:LPC1788  IIC使用 引用地址:LPC1788的IIC使用

上一篇:为什么LPC1788不支持Linux
下一篇:MicroPython之LPC1788移植

推荐阅读最新更新时间:2024-11-07 10:22

LPC1788--ADC连续中断多通道转换程序学习分析
LPC1788的ADC转换可以单次转换-也可以连续转换---可以轮询--也可以中断---这里使用的是中断连续转换3个通道的AD值----主要是对AD控制寄存器CR的设置与中断函数中对AD通道的判断。 在主函数中只需要调用初始化函数与在循环采集中不停打开ADC中断--因为在中断函数中为了防止中断嵌套禁止了ADC中断 /////////////////////////////////////////////////////////// void main(void) { uint32_t i; ADC_Init(60000000,4000000); //初始化---外设时钟60M--ADC转换频率4M while
[单片机]
LPC1788 SystemInit函数分析
void SystemInit (void) { #if (CLOCK_SETUP) /* Clock Setup */ LPC_SC- SCS = SCS_Val; /*主振荡器使能 */ if (SCS_Val & (1 5)) /* If Main Oscillator is enabled */ { while ((LPC_SC- SCS & (1 6)) == 0);/* Wait for Oscillator to be ready */ } LPC_SC- CLKSRCSEL = CLKSRCSEL_Val;
[单片机]
使用IIC去驱动MPU6050时为什么总读取失败
01概述 在之前的文章中《I2C基础原理及协议》中详细讲解了IIC协议,并且使用是NXP的官方手册,demo示例使用IIC读取RTC芯片,运行正常,没有任何问题。并且更新了《IIC踩过的坑》,讲述了在使用IIC读取RTC芯片时遇到的问题,并成功解决。 我以为我已经完全学会了IIC,但现实却打了脸,我在使用《STM32IIC详解》文中的IIC驱动,去驱动MPU6050时,总是读取失败。这个驱动明明是验证过的,为什么会有问题。让我一度很是郁闷。 02问题 不卖关子,直接说问题,是我之前的IIC驱动有问题。 问题1: 错误将CLK信号GPIO设置为推挽输出。应该设置为开漏输出。 问题2: 读取函数有bug。1处应该先左移再读
[单片机]
<font color='red'>使用</font><font color='red'>IIC</font>去驱动MPU6050时为什么总读取失败
集成LCD图像控制器的微控制器
中国上海,2011年6月2日讯——恩智浦半导体NXP Semiconductors N.V.(Nasdaq: NXP)近日发布了LPC1788微控制器,这是业界首款采用ARM® Cortex™-M3技术且集成LCD控制器的MCU,目前已批量上市。LPC178x系列拥有最高96KB片上SRAM以及32位外接存储器接口,帮助客户轻松实现低成本、高质量的图像应用。LPC178x系列支持众多图像显示面板,是工业自动化、销售网点和医疗诊断应用的理想选择。 恩智浦微控制器产品线市场总监Jan Jaap Bezemer表示:“人机接口技术的最新发展正引入更多的LCD显示技术到 工业、零售和医疗领域。集成LCD控制器的LPC1
[单片机]
集成LCD图像控制器的微控制器
MSP430与PCF8576驱动程序(可以借鉴IIC使用方法)
#i nclude msp430x14x.h #define uint unsigned int #define uchar unsigned char #define Num_of_Results 8 unsigned int results ; uchar PCF8576=0x70;//器件地址 //内存数据定义 uchar ByteCnt; //I2C 数据字节计数器 uchar SlvAdr; //被控器地址 uchar SubAdr; //被控器单元地址 uchar XmtDat ; //发送数据缓冲区 uchar MODE2=0xCD; uchar B
[单片机]
LPC1788 LCD 学习
好不容易继续来搞搞这个单片机,虽然出了好多年,但是被ST打得体无完肤.就有LCD控制器,SDRAM这个优势来说,基本上已经到了老的的程度了.而且用起这个LCD,好像也不是特别的复杂,原来以为很麻烦的,因为手册说的什么专用DMA啊,专用图形加速啊.在调试过程中出现了好多次的闪屏,差点以为是自己的板子画得有问题,不过后来发现是总线占用过长,需要优化一下. 开始做LCD,肯定要开辟RAM空间.先算算我的屏幕是1024*600 ,然后从RAM的尾端开始截取部分RAM来用.计算公式: 0xA1FFFFFF - 1024 *600 *2 = 0xA1ED3FFF | 153.6KB 然后实际上就是往自己RAM写东西,他就会倒到屏幕
[单片机]
<font color='red'>LPC1788</font> LCD 学习
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多开源项目推荐
换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved