NXP LPC11xx I2C Slave 从机程序
/**************************************************************************** * $Id:: i2cslave.c 3635 2010-06-02 00:31:46Z usb00423 $ * Project: NXP LPC11xx I2C Slave example * * Description: * This file contains I2C slave code example which include I2C slave * initialization, I2C slave interrupt handler, and APIs for I2C slave * access. * **************************************************************************** * Software that is described herein is for illustrative purposes only * which provides customers with programming information regarding the * products. This software is supplied "AS IS" without any warranties. * NXP Semiconductors assumes no responsibility or liability for the * use of the software, conveys no license or title under any patent, * copyright, or mask work right to the product. NXP Semiconductors * reserves the right to make changes in the software without * notification. NXP Semiconductors also make no representation or * warranty that such application will be suitable for the specified * use without further testing or modification. ****************************************************************************/ #include "LPC11xx.h"/* LPC11xx Peripheral Registers */ #include "type.h" #include "i2cslave.h" volatile uint32_t I2CMasterState = I2C_IDLE; volatile uint32_t I2CSlaveState = I2C_IDLE; volatile uint32_t I2CMode; volatile uint8_t I2CWrBuffer[BUFSIZE]; volatile uint8_t I2CRdBuffer[BUFSIZE]; volatile uint32_t I2CReadLength; volatile uint32_t I2CWriteLength; ; ; /* From device to device, the I2C communication protocol may vary, in the example below, the protocol uses repeated start to read data from or write to the device: For master read: the sequence is: STA,Addr(W),offset,RE-STA,Addr(r),data...STO for master write: the sequence is: STA,Addr(W),offset,RE-STA,Addr(w),data...STO Thus, in state 8, the address is always WRITE. in state 10, the address could be READ or WRITE depending on the I2C command. */ /***************************************************************************** ** Function name:I2C_IRQHandler ** ** Descriptions:I2C interrupt handler, deal with master mode only. ** ** parameters:None ** Returned value:None ** *****************************************************************************/ void I2C_IRQHandler(void) { uint8_t StatValue; /* this handler deals with master read and master write only */ StatValue = LPC_I2C->STAT; switch ( StatValue ) { case 0x60:/* An own SLA_W has been received. */ case 0x68: RdIndex = ; LPC_I2C->CONSET = I2CONSET_AA;/* assert ACK after SLV_W is received */ LPC_I2C->CONCLR = I2CONCLR_SIC; I2CSlaveState = I2C_WR_STARTED; break; case 0x80:/* data receive */ case 0x90: if ( I2CSlaveState == I2C_WR_STARTED ) { I2CRdBuffer[RdIndex++] = LPC_I2C->DAT; LPC_I2C->CONSET = I2CONSET_AA;/* assert ACK after data is received */ } else { LPC_I2C->CONCLR = I2CONCLR_AAC;/* assert NACK */ } LPC_I2C->CONCLR = I2CONCLR_SIC; break; case 0xA8:/* An own SLA_R has been received. */ case 0xB0: RdIndex = ; LPC_I2C->CONSET = I2CONSET_AA;/* assert ACK after SLV_R is received */ LPC_I2C->CONCLR = I2CONCLR_SIC; I2CSlaveState = I2C_RD_STARTED; WrIndex = I2CRdBuffer[];/* The 1st byte is the index. */ break; case 0xB8:/* Data byte has been transmitted */ case 0xC8: if ( I2CSlaveState == I2C_RD_STARTED ) { LPC_I2C->DAT = I2CRdBuffer[WrIndex+];/* write the same data back to master */ WrIndex++;/* Need to skip the index byte in RdBuffer */ LPC_I2C->CONSET = I2CONSET_AA;/* assert ACK */ } else { LPC_I2C->CONCLR = I2CONCLR_AAC;/* assert NACK */ } LPC_I2C->CONCLR = I2CONCLR_SIC; break; case 0xC0:/* Data byte has been transmitted, NACK */ LPC_I2C->CONCLR = I2CONCLR_AAC;/* assert NACK */ LPC_I2C->CONCLR = I2CONCLR_SIC; I2CSlaveState = DATA_NACK; break; case 0xA0:/* Stop condition or repeated start has */ LPC_I2C->CONSET = I2CONSET_AA;/* been received, assert ACK. */ LPC_I2C->CONCLR = I2CONCLR_SIC; I2CSlaveState = I2C_IDLE; break; default: LPC_I2C->CONCLR = I2CONCLR_SIC; LPC_I2C->CONSET = I2CONSET_I2EN | I2CONSET_SI; break; } return; } /***************************************************************************** ** Function name:I2CSlaveInit ** ** Descriptions:Initialize I2C controller ** ** parameters:I2c mode is either MASTER or SLAVE ** Returned value:true or false, return false if the I2C **interrupt handler was not installed correctly ** *****************************************************************************/ void I2CSlaveInit( void ) { /* SSP and I2C reset are overlapped, a known bug, for now, both SSP and I2C use bit 0 for reset enable. Once the problem is fixed, change to "#if 1". */ #if 1 LPC_SYSCON->PRESETCTRL |= (); #else LPC_SYSCON->PRESETCTRL |= (); #endif LPC_SYSCON->SYSAHBCLKCTRL |= (<<); LPC_IOCON->PIO0_4 &= ~0x3F;/* I2C I/O config */ LPC_IOCON->PIO0_4 |= 0x01;/* I2C SCL */ LPC_IOCON->PIO0_5 &= ~0x3F; LPC_IOCON->PIO0_5 |= 0x01;/* I2C SDA */ /*--- Clear flags ---*/ LPC_I2C->CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC | I2CONCLR_I2ENC; /*--- Reset registers ---*/ #if FAST_MODE_PLUS LPC_IOCON->PIO0_4 |= (); LPC_IOCON->PIO0_5 |= (); LPC_I2C->SCLL = I2SCLL_HS_SCLL; LPC_I2C->SCLH = I2SCLH_HS_SCLH; #else LPC_I2C->SCLL = I2SCLL_SCLL; LPC_I2C->SCLH = I2SCLH_SCLH; #endif LPC_I2C->ADR0 = PCF8594_ADDR; I2CSlaveState = I2C_IDLE; /* Enable the I2C Interrupt */ NVIC_EnableIRQ(I2C_IRQn); LPC_I2C->CONSET = I2CONSET_I2EN | I2CONSET_SI; return; } /****************************************************************************** ** End Of File ******************************************************************************/ /**************************************************************************** * $Id:: i2cslave.h 3635 2010-06-02 00:31:46Z usb00423 $ * Project: NXP LPC11xx I2C Slave example * * Description: * This file contains I2C slave code header definition. * **************************************************************************** * Software that is described herein is for illustrative purposes only * which provides customers with programming information regarding the * products. This software is supplied "AS IS" without any warranties. * NXP Semiconductors assumes no responsibility or liability for the * use of the software, conveys no license or title under any patent, * copyright, or mask work right to the product. NXP Semiconductors * reserves the right to make changes in the software without * notification. NXP Semiconductors also make no representation or * warranty that such application will be suitable for the specified * use without further testing or modification. ****************************************************************************/ #ifndef __I2CSLAVE_H #define __I2CSLAVE_H #define FAST_MODE_PLUS 1 #define BUFSIZE 6 #define MAX_TIMEOUT 0x00FFFFFF #define PCF8594_ADDR 0xA0 #define READ_WRITE 0x01 #define RD_BIT 0x01 #define I2C_IDLE 0 #define I2C_STARTED 1 #define I2C_RESTARTED 2 #define I2C_REPEATED_START 3 #define DATA_ACK 4 #define DATA_NACK 5 #define I2C_WR_STARTED 6 #define I2C_RD_STARTED 7 #define I2CONSET_I2EN (0x1<<6) /* I2C Control Set Register */ #define I2CONSET_AA (0x1<<2) #define I2CONSET_SI (0x1<<3) #define I2CONSET_STO (0x1<<4) #define I2CONSET_STA (0x1<<5) #define I2CONCLR_AAC (0x1<<2) /* I2C Control clear Register */ #define I2CONCLR_SIC (0x1<<3) #define I2CONCLR_STAC (0x1<<5) #define I2CONCLR_I2ENC (0x1<<6) #define I2DAT_I2C 0x00000000 /* I2C Data Reg */ #define I2ADR_I2C 0x00000000 /* I2C Slave Address Reg */ #define I2SCLH_SCLH 0x00000180 /* I2C SCL Duty Cycle High Reg */ #define I2SCLL_SCLL 0x00000180 /* I2C SCL Duty Cycle Low Reg */ #define I2SCLH_HS_SCLH 0x00000020 /* Fast Plus I2C SCL Duty Cycle High Reg */ #define I2SCLL_HS_SCLL 0x00000020 /* Fast Plus I2C SCL Duty Cycle Low Reg */ extern void I2C_IRQHandler( void ); extern void I2CSlaveInit( void ); #endif /* end __I2CSLAVE_H */ /**************************************************************************** ** End Of File *****************************************************************************/ /**************************************************************************** * $Id:: i2cslvtst.c 3635 2010-06-02 00:31:46Z usb00423 $ * Project: NXP LPC11xx I2C example * * Description: * This file contains I2C slave test modules, main entry, to test I2C * slave APIs. * **************************************************************************** * Software that is described herein is for illustrative purposes only * which provides customers with programming information regarding the * products. This software is supplied "AS IS" without any warranties. * NXP Semiconductors assumes no responsibility or liability for the * use of the software, conveys no license or title under any patent, * copyright, or mask work right to the product. NXP Semiconductors * reserves the right to make changes in the software without * notification. NXP Semiconductors also make no representation or * warranty that such application will be suitable for the specified * use without further testing or modification. ****************************************************************************/ #include "LPC11xx.h"/* LPC11xx Peripheral Registers */ #include "type.h" #include "i2cslave.h" extern volatile uint8_t I2CWrBuffer[BUFSIZE]; extern volatile uint8_t I2CRdBuffer[BUFSIZE]; extern volatile uint32_t I2CSlaveState; extern volatile uint32_t I2CReadLength, I2CWriteLength; /******************************************************************************* ** Main Function main() *******************************************************************************/ int main (void) { uint32_t i; SystemInit(); ; i < BUFSIZE; i++ ) { I2CRdBuffer[i] = 0x00; } I2CSlaveInit();/* initialize I2c */ /* When the NACK occurs, the master has stopped the communication. Just check the content of I2CRd/WrBuffer. */ while ( I2CSlaveState != DATA_NACK ); ; } /****************************************************************************** ** End Of File ******************************************************************************/
NXP LPC11xx I2C Slave 从机程序的更多相关文章
- java: Runtime和Process调用本机程序
java: Runtime和Process调用本机程序 调用纸牌程序,Process用来销毁程序 import java.io.IOException; public class RunTimeDem ...
- JAVA - ATM机程序
ATM机程序 UnionPayTest.java package oo.day06.work; public class UnionPayTest { } interface UnionPay{ // ...
- vc++MFC开发上位机程序
用vc++MFC开发过不少跟单片机通讯的上位机程序了.搞懂了MFC架构,开发还是很快的,与底层单片机程序通讯,可以用串口.usb.网络.短信形式.串口现在用的越来越少了,一般电脑跟单片机在一块,使用串 ...
- VC++编写简单串口上位机程序
VC++编写简单串口上位机程序 转载: http://blog.sina.com.cn/s/articlelist_1809084904_0_1.html VC++编写简单串口上位机程序 串口通信 ...
- 如何在linux中测试i2c slave模式驱动的功能?
1. 硬件要求 1.1 需要两台机器,一台作为i2c master(记为M),另一台作为i2c slave(记为S) 1.2 使用杜邦线连接两台机器的i2c信号线 2. 使能内核选项CONFIG_I2 ...
- 模拟I2C从机程序
;Slave.asm SCL BIT P1. SDA BIT P1. ;---------------------------- ORG RESET: SETB SCL SETB SDA CALL I ...
- QT编写上位机程序一定要初始化变量以及谨慎操作指针
背景: 在编写QT上位机界面时,界面在运行的时候经常出现卡死或者直接挂掉的怪现象. 正文: 上位机有个函数为check_receive():该函数的作用为定时调用循环检测USB是否有数据.若有,则将信 ...
- 第一次尝试使用JAVA编写的ATM机程序
package study; import java.util.Scanner; public class ATM { private static int[] users = { 111111, 2 ...
- tomcat如何按站点调试本机程序
1.配置host host地址:c:\windows\system32\drivers\etc 配置本机域名: # localhost name resolution is handled withi ...
随机推荐
- nginx代理人server结合tomcat采用
相信非常多人都听过nginx,这个小巧的东西慢慢地在吞食apache和IIS的份额.那到底它有什么作用呢?可能非常多人未必了解. 说到反向代理,可能非常多人都听说,但详细什么是反向代理,非常多人预计就 ...
- SA密钥长度、明文长度和密文长度
本文介绍RSA加解密中必须考虑到的密钥长度.明文长度和密文长度问题,对第一次接触RSA的开发人员来说,RSA算是比较复杂的算法,RSA的复杂度是因为数学家把效率和安全也考虑进去的缘故. 本文先只谈密钥 ...
- iOS RSA 加密解密及签名验证
1.首先要下载openssl.这个不用说,直接官网下载或者用brew install openssl下载. 2.终端生成私钥密钥. 2.1生成私钥 openssl genrsa - 2.2生成密钥 o ...
- IntelliJ Idea 常用快捷键列表(精简版)
查找快捷键: Ctrl+N 查找类 Ctrl+shift+N 查找文件 Ctrl+B 找变量来源 Ctrl+E 最近打开的文件 Ctrl+Alt+B 选中方法的实现 Ctrl+F7 选中方法(属性. ...
- gulp的常用api
gulp是什么? http://gulpjs.com/ 相信你会明白的! 与著名的构建工具grunt相比,有什么优势呢? 易于使用,代码优于配置 高效,不会产生过多的中间文件,减少I/O压力 易于学习 ...
- 使用Sqlite数据库存储数据
1.Sql基本命令 1.1.创建表 表是有行和列组成的,列称为字段,行称为记录. 使用CREATE命令来创建表: 1 CREATE TABLE tab_student (studentId INTEG ...
- power desinger 学习笔记<二>
power designer 设计表时显示注释选项 PowerDesigner设计时表显示注释选项: 选定编辑的表,右键- > Properties- > Columns- > Cu ...
- (whh仅供自己参考)进行ip网络请求的步骤
这个过程大致是这个样子: 1 添加通知 2 发送网络请求 里边有一个发送通知的操作 3 执行发送通知的具体操作 代码如下: 1 在VC添加通知 [[NSNotificationCenter defau ...
- 求fibonacci数列 java
java 和 c 差不多.但是java可以根据需求定义数组. 我还不会java的函数调用,所以用数组的方法. import java.util.Scanner; public class fibon{ ...
- iOS打包ipa 让别人设备安装你的App
首先推荐一本书<一步一步学习iOS 5编程(第二版) – PDF 中文版>在一本学习IOS入门很不错的书籍,目前,这是第一本介绍iOS 5.x 和 Xcode 4.3 的中文版书籍,尤其适 ...