I2C通信使用中断

7个帖子/ 0个新
最后发表
米尔阿里
离线
最后看到:4年3个星期前
加入:2014-07-09火灾
I2C通信使用中断

嗨JE_Dialog,

你能给我一份使用中断的I2C通信的文档吗?
如果没有正式文件,你可以帮我回答以下问题:
1.如何使I2C中断模式运行?(主模式)
2.如何读取I2C通信状态码?
3.请告诉我在主发射机和接收机模式下的格式和状态。
4.请给我一个这样的示例代码:

空白I2C_IRQHandler(空白)

uint8_t StatValue;

超时= 0;
/*这个处理程序只处理主读和主写
StatValue = LPC_I2C - >统计;
switch (StatValue)

case 0x08: /*触发启动条件。*/
WrIndex = 0;
LPC_I2C - > DAT = I2CMasterBuffer (WrIndex + +);
Lpc_i2c -> conclr = (i2conclr_sic | i2conclr_stac);
打破;

case 0x10: /* A repeated started is issued */
RdIndex = 0;
/*发送设置R位的SLA, */
LPC_I2C - > DAT = I2CMasterBuffer (WrIndex + +);
Lpc_i2c -> conclr = (i2conclr_sic | i2conclr_stac);
打破;

case 0x18: /*无论如何,它是一个ACK */
if (I2CWriteLength == 1)

LPC_I2C - > CONSET = I2CONSET_STO;/*设置停止标志*/
I2CMasterState = I2C_NO_DATA;

其他的

LPC_I2C - > DAT = I2CMasterBuffer (WrIndex + +);

LPC_I2C - > CONCLR = I2CONCLR_SIC;
打破;

case 0x28: /* Data byte has been sent, regardless of ACK or NACK */
if (WrIndex < I2CWriteLength)

LPC_I2C - > DAT = I2CMasterBuffer (WrIndex + +);/*这应该是最后一个*/

其他的

if (I2CReadLength != 0)

LPC_I2C - > CONSET = I2CONSET_STA;/*设置重复开始标志*/

其他的

LPC_I2C - > CONSET = I2CONSET_STO;/*设置停止标志*/
I2CMasterState = I2C_OK;


LPC_I2C - > CONCLR = I2CONCLR_SIC;
打破;

例0 x30:
LPC_I2C - > CONSET = I2CONSET_STO;/*设置停止标志*/
I2CMasterState = I2C_NACK_ON_DATA;
LPC_I2C - > CONCLR = I2CONCLR_SIC;
打破;

case 0x40: /* Master Receive, SLA_R has been sent */
if ((RdIndex + 1) < I2CReadLength)

/*将进入状态0x50 */
LPC_I2C - > CONSET = I2CONSET_AA;/*在收到数据后断言ACK */

其他的

/*将进入状态0x58 */
LPC_I2C - > CONCLR = I2CONCLR_AAC;/*收到数据后断言NACK */

LPC_I2C - > CONCLR = I2CONCLR_SIC;
打破;

case 0x50: /* Data byte has been received,不管后面是ACK还是NACK */
I2CSlaveBuffer [RdIndex + +] = LPC_I2C - > DAT;
if ((RdIndex + 1) < I2CReadLength)

LPC_I2C - > CONSET = I2CONSET_AA;/*在收到数据后断言ACK */

其他的

LPC_I2C - > CONCLR = I2CONCLR_AAC;/* assert NACK on last byte */

LPC_I2C - > CONCLR = I2CONCLR_SIC;
打破;

例0 x58:
I2CSlaveBuffer [RdIndex + +] = LPC_I2C - > DAT;
I2CMasterState = I2C_OK;
LPC_I2C - > CONSET = I2CONSET_STO;/*设置停止标志*/
LPC_I2C - > CONCLR = I2CONCLR_SIC;/*清除SI标记*/
打破;

case 0x20: /*无论如何,它是一个NACK */
例0 x48:
LPC_I2C - > CONSET = I2CONSET_STO;/*设置停止标志*/
I2CMasterState = I2C_NACK_ON_ADDRESS;
LPC_I2C - > CONCLR = I2CONCLR_SIC;
打破;

case 0x38: /*仲裁失败,在这个例子中,我们没有
处理多个主情况*/
默认值:
I2CMasterState = I2C_ARBITRATION_LOST;
LPC_I2C - > CONCLR = I2CONCLR_SIC;
打破;

返回;

最好的问候,

米尔阿里
离线
最后看到:4年3个星期前
加入:2014-07-09火灾
你能帮我吗?

你能帮我吗?

JE_Dialog
离线
最后看到:1周5天前
工作人员
加入:2013-12-05 14:02
你好,米尔·阿里,唯一的

你好,Mir Ali,我们现在拥有的唯一示例是UM-B-005中的外设驱动程序示例,用于EEPROM的标准i2c读写命令。我们有几个正在开发的加速器应用程序,但它们离完成还有几周的时间。

我会让软件团队的一个人看看你的问题,但这需要几天的时间。

BR JE_Dialog

PY_Dialog
离线
最后看到:2年11个月前
工作人员
加入:2014-08-25“
嗨,阿里,

嗨,阿里,

我认为你从NXP复制的代码使用了某种软件I2C。即对I2C通信的每个状态产生中断,需要在ISR中添加代码来处理I2C通信的状态机。实际上Dialog提供了完整的硬件I2C支持,所以你可以从我们的数据表中看到状态机已经在HW中实现了,包括从机和主机。因此,在DA14580中使用I2C会更容易,您不需要关心处理状态更改的脏工作,只需用几行代码在特定地址上写入或获取字节。

可以参考DA14580_peripheral的样例代码,那里可以得到样例代码,比I2C软件更简单。

的问候!
PY

n.lamarti
离线
最后看到:6年6个月前
加入:2014-06-23 16:31
嗨PY,

嗨PY,

我想有件事我不明白。如果你必须主动检查硬件寄存器,DA14580如何成为I2C从机并做其他事情。我想我不明白DA14580通常是如何使用中断的

国王认为,

Naoufal

PY_Dialog
离线
最后看到:2年11个月前
工作人员
加入:2014-08-25“
嗨Naoufal,

嗨Naoufal,

艾莉的代码是主模式I2C的目标。我认为你要求的是从属模式I2C,对吗?实际上很少有人会在从模式下使用我们的I2C,尽管我们可以支持从模式状态机。因此,从模式I2C目前没有文档或参考代码。如果可以的话,我会建议你选择Uart或者SPI。

的问候!
PY

jialin0450
离线
最后看到:6年3个星期前
加入:2014-12-16 14
嗨,对话框

嗨,对话框
在I2C从机模式下,如何启动中断?哪个注册记录启用中断?