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 ...
随机推荐
- 读取一个文件,将其Base64编码,每76个字符加一个换行(转)
echo chunk_split(base64_encode(file_get_contents('base64.txt'))); 例子 1 本例分隔每个字符,并添加 ".": & ...
- SpringMVC + Spring 3.2.14 + Hibernate 3.6.10 集成详解
注:此文档只说明简单的框架集成,各个框架的高级特性未涉及,刚刚接触框架的新人可能需要参考其他资料. PS:本次练习所用jar包都能在此下载到:http://pan.baidu.com/s/1sjmgd ...
- 如何进去bios设置
1.BIOS是英文"Basic Input Output System"的缩略语,直译过来后中文名称就是"基本输入输出系统".其实,它是一组固化到计算机内主板上 ...
- [转] 学习React Native必看的几个开源项目
http://www.lcode.org/study-react-native-opensource-one/ http://gold.xitu.io/entry/575f498c128fe10057 ...
- Java基础知识强化16:深入分析Java线程中断机制
1.Thread.interrupt真的能中断线程吗? 在平时的开发过程中,相信都会使用到多线程,在使用多线程时,大家也会遇到各种各样的问题,今天我们就来说说一个多线程的问题——线程中断. ...
- oo面向对象原则
1.单一职责原则 一个类,最好只做一件事,只有一个引起他变化的原因否则就应该考虑重构. 2.开放封闭原则 软件实体应该是可扩展的,而不是可修改的.也就是说对扩展开放,对修改封闭.主要体现在两个方面: ...
- 利用DIV,实现简单的网页布局
<html lang="en"><head> <meta charset="UTF-8"> <title>GIS ...
- updatepanel局部刷新功能,实现注册时对用户名的检测
updatepanel的使用 通过将控件放入到updatepanel中,实现局部刷新. 前台代码:<asp:ScriptManager ID="ScriptManager1" ...
- C#获取类中所有方法
var t = typeof(HomeController); //获取所有方法 System.Reflection.MethodInfo[] methods = t.GetMethods(); // ...
- 用java写bp神经网络(四)
接上篇. 在(一)和(二)中,程序的体系是Net,Propagation,Trainer,Learner,DataProvider.这篇重构这个体系. Net 首先是Net,在上篇重新定义了激活函数和 ...