历史上的今天
今天是:2025年01月15日(星期三)
2019年01月15日 | LPC_11C14平台I2C分析
2019-01-15 来源:eefocus
1) IIC的初始化:复位IIC,使能IIC时钟单元,设置相应的I0口为IIC功能,清除应答位、起始位、中断位、IIC使能位,设置IIC传输速率,如果是从机的话,设置从机地址,IIC中断使能,最后启动IIC.
2) IIC的启动
uint32_t I2CStart( void )
{
uint32_t timeout = 0;
uint32_t retVal = FALSE;
LPC_I2C->CONSET = I2CONSET_STA //设置起始位
/*循环等待起始位发送,设置超时时间*/
while( 1 )
{
if ( I2CMasterState == I2C_STARTED ) //起始位发送成功,中断中设置
{
retVal = TRUE;
break;
}
if ( timeout >= I2C_MAX_TIMEOUT ) //起始位发送超时
{
retVal = FALSE;
break;
}
timeout++;
}
return( retVal );
}
3)IIC的停止
uint32_t I2CStop( void )
{
LPC_I2C->CONSET = I2CONSET_STO; //设置停止位
LPC_I2C->CONCLR = I2CONCLR_SIC; //清除中断标志
/*等待停止位发送*/
while( LPC_I2C->CONSET & I2CONSET_STO );
return TRUE;
}
4)IIC的一次完整通信
uint32_t I2CEngine( void )
{
I2CMasterState = I2C_IDLE; //初始状态
RdIndex = 0;
WrIndex = 0;
if ( I2CStart() != TRUE ) //发送启动信号
{
I2CStop();
return ( FALSE );
}
while ( 1 )
{
if ( I2CMasterState == DATA_NACK ) //判断数据是否传输完毕
{
I2CStop(); //IIC停止
break;
}
}
return ( TRUE );
}
5)主发送代码
void I2CWrite(uint8_t addr, uint8_t* buf, uint32_t len)
{
I2CAddr = addr; //设置从机地址
I2CMasterBuffer = buf; //主发送Buffer指向要传输的数据
I2CWriteLength = len; //发送数据的长度
I2CReadLength = 0;
I2CEngine(); //启动IIC完整的通信过程
I2CWriteLength = I2CWriteLength;
}
6)中断处理函数
每次状态的改变,SI位都会置位,在中断处理函数中,根据不同的状态码,进行相应的操作,在这些操作中,清除SI位是必须要做的,在这里主要列出主发送中断的处理函数部分,其他部分可根据数据手册的操作流程进行相应的操作。
void I2C_IRQHandler(void)
{
uint8_t StatValue;
/* 仅列出了主发送方式的处理*/
StatValue = LPC_I2C->STAT; //读取状态码
witch ( StatValue ) //根据状态码执行不同的操作
{
case 0x08: //已发送起始条件
WrIndex = 0;
LPC_I2C->DAT = I2CAddr; //SLA + W装入数据寄存器
LPC_I2C->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC);//请吃 SIC及STAC位
I2CMasterState = I2C_STARTED;
break;
case 0x10: //已发送重复起始条件
RdIndex = 0;
/* 发送SLA + R状态位 */
LPC_I2C->DAT = I2CAddr;
LPC_I2C->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC);
I2CMasterState = I2C_RESTARTED;
break;
case 0x18: //以发送SLA + W,并已接受ACK
if ( I2CMasterState == I2C_STARTED )
{
LPC_I2C->DAT = I2CMasterBuffer[WrIndex++]; //发送数据写入DATA寄存器
I2CMasterState = DATA_ACK;
}
LPC_I2C->CONCLR = I2CONCLR_SIC;
break;
case 0x28: /* 数据已发送,返回ACK或非ACK*/
case 0x30:
if ( WrIndex < I2CWriteLength ) //判断是否发送完,未完继续发送
{
LPC_I2C->DAT = I2CMasterBuffer[WrIndex++];
I2CMasterState = DATA_ACK;
}
Else //指定长度的数据已发送完
{
if ( I2CReadLength != 0 )
{
LPC_I2C->CONSET = I2CONSET_STA; //设置重复起始条件
I2CMasterState = I2C_REPEATED_START;
}
else
{
I2CMasterState = DATA_NACK;
LPC_I2C->CONSET = I2CONSET_STO; // 置位停止位
}
}
LPC_I2C->CONCLR = I2CONCLR_SIC;
break;
……
上一篇:LPC11C14通信接口之I2C
史海拾趣
|
差分线对的工作原理是使接收到的信号等于两个互补并且彼此互为参考的信号之间的差值,因此可以极大地降低信号的电气噪声效应。而单端信号的工作原理是接收信号等于信号与电源或地之间的差值 ,因此信号或电源系统上的噪声不能被有效抵消。这就 ...… 查看全部问答> |
|
哪位用过ZLG7290这款芯片,我现在也在使用。 我想请教大家个问题:如何写驱动实现控制wince的系统菜单的?比如打开左下角的菜单,上下移动菜单,或者关闭任意程序等。谢谢… 查看全部问答> |
|
wince5.0 window media player 6.4 支持标准RTSP 要让wince5.0 window media player 6.4 支持标准RTSP,所以要写一个RTSP 的filter, 我的问题是,只要注册了这个rtsp的filter ,用media player6.4接收rtsp的流就会直接调用我这个RTSP 的filter? 还是还要修改注册表其他地方??… 查看全部问答> |
|
USB接口(Universal Serial Bus)是一种通用的高速串行接口。它最主要的特点是它的高速传输特性。USB1.1理论速度极限可以达到12Mb/s,USB2.0可达到480Mb/s。这样,它可以很好解决大数据量的数据在嵌入式系统与PC机之间的互传问题;同时,它支持热 ...… 查看全部问答> |
|
IEEE JSSC的论文从60年代到2005年全集15G电骡地址 由于原文档太大,采用点对点的方法很占带宽,现在改用电螺分享,速度会很快,为了方便下载,重新打包成700M的大小,共18个文档,地址文件详见附件。 晚上10:00以后速度会很快,不过总共有12G的内容,一个新的文档要下完还是需要一定时间的。 最后 ...… 查看全部问答> |
|
#include static unsigned int results; void main(void) { volatile unsigned int i;//unsigned long int j; WDTCTL = WDTPW+WDTHOLD;   ...… 查看全部问答> |




