i2c使用中断通信

7个帖子/ 0新
最后一篇
米尔阿里
离线
最后一次露面:3年11个月前
加入:2014-07-09 11:35
i2c使用中断通信

嗨je_dialog,

你能用中断给我与I2C通信相关的文件吗?
如果没有官方文件,您可以为我回答以下问题:
1.如何启用I2C中断模式操作?(主模式)
2.如何阅读I2C通信的状态代码?
请向我展示主发射器和接收器模式中的格式和状态。
4.请给我一个小的示例代码:

void i2c_irqhandler(void)
{
uint8_t statvalue;

超时= 0;
/ *此处理程序处理主读和主编写* /
statvalue = lpc_i2c-> stat;
开关(STATVALUE)
{
案例0x08:/ *发出启动条件。* /
wrindex = 0;
lpc_i2c-> dat = i2cmastersbuffer [wrindex ++];
lpc_i2c-> stubr =(i2conclr_sic | i2conclr_stac);
休息;

案例0x10:/ *重复启动* /
rdindex = 0;
/ *用R位设置发送SLA,* /
lpc_i2c-> dat = i2cmastersbuffer [wrindex ++];
lpc_i2c-> stubr =(i2conclr_sic | i2conclr_stac);
休息;

案例0x18:/ *无论如何,它是一个ack * /
if(i2cwriteLength == 1)
{
lpc_i2c-> content = i2conset_sto;/ *设置停止标志* /
i2cmasterstate = i2c_no_data;
}
别的
{
lpc_i2c-> dat = i2cmastersbuffer [wrindex ++];
}
lpc_i2c-> stubr = i2conclr_sic;
休息;

案例0x28:/ *数据字节已被传输,无论是ACK还是NACK * /
if(wrindex {
lpc_i2c-> dat = i2cmastersbuffer [wrindex ++];/ *这应该是最后一个* /
}
别的
{
if(i2creadlength!= 0)
{
lpc_i2c-> content = i2conset_sta;/ *设置重复启动标志* /
}
别的
{
lpc_i2c-> content = i2conset_sto;/ *设置停止标志* /
i2cmasterstate = i2c_ok;
}
}
lpc_i2c-> stubr = i2conclr_sic;
休息;

案例0x30:
lpc_i2c-> content = i2conset_sto;/ *设置停止标志* /
i2cmasterstate = i2c_nack_on_data;
lpc_i2c-> stubr = i2conclr_sic;
休息;

案例0x40:/ *主接收,SLA_R已发送* /
if((rdindex + 1){
/ *将转到州0x50 * /
lpc_i2c-> content = i2conset_aa;/ *收到数据后断言ACK * /
}
别的
{
/ *将转到州0x58 * /
lpc_i2c-> stubr = i2conclr_aac;/ *收到数据后assert nack * /
}
lpc_i2c-> stubr = i2conclr_sic;
休息;

案例0x50:/ *已收到数据字节,无论遵循ACK或NACK * /
i2cslavebuffer [rdindex ++] = lpc_i2c-> dat;
if((rdindex + 1){
lpc_i2c-> content = i2conset_aa;/ *收到数据后断言ACK * /
}
别的
{
lpc_i2c-> stubr = i2conclr_aac;/ *在最后一个字节上assert nack * /
}
lpc_i2c-> stubr = i2conclr_sic;
休息;

案例0x58:
i2cslavebuffer [rdindex ++] = lpc_i2c-> dat;
i2cmasterstate = i2c_ok;
lpc_i2c-> content = i2conset_sto;/ *设置停止标志* /
lpc_i2c-> stubr = i2conclr_sic;/ *清除Si标志* /
休息;

案例0x20:/ *无论如何,它是一个nack * /
案例0x48:
lpc_i2c-> content = i2conset_sto;/ *设置停止标志* /
i2cmasterstate = i2c_nack_on_address;
lpc_i2c-> stubr = i2conclr_sic;
休息;

案例0x38:/ *仲裁丢失,在这个例子中,我们没有
处理多个主体情况* /
默认:
i2cmasterstate = i2c_arbitration_lost;
lpc_i2c-> stubr = i2conclr_sic;
休息;
}
返回;
}

此致,

米尔阿里
离线
最后一次露面:3年11个月前
加入:2014-07-09 11:35
你能帮助我吗?

你能帮助我吗?

je_dialog
离线
最后一次露面:3周2天前
职员
加入:2013-12-05 14:02
你好米尔阿里,唯一的

Hello Mir Ali,我们现在拥有的唯一示例是在EEPROM的标准I2C读/写命令的UM-B-005中的外围驱动程序示例。我们在开发中有几个加速器应用程序,但他们几周距离Finsihed。

我将获得其中一个软件团队来看看你的问题,但它将是几天。

BR JE_DIALOG.

py_dialog.
离线
最后一次露面:2年9个月前
职员
加入:2014-08-25 09:59
嗨阿里,

嗨阿里,

我认为您从NXP复制的代码正在使用某种软件I2C。意味着它为I2C通信的每个状态生成中断,并且需要在ISR中添加代码来处理I2C通信的状态机。实际上对话框提供完整的硬件I2C支持,以便您可以从我们的数据表中看到状态机已经在HW中实现,包括从站和主机。因此,您在DA14580中使用I2C会更容易,您不需要关心处理状态更改的脏效,只需在具有多行代码的某些地址上写入或抓取字节。

您可以参考DA14580_Peripheral示例代码,在那里您可以获得示例代码,比软件I2C更简单。

问候!
PY

n.lamarti.
离线
最后一次露面:6年5个月前
加入:2014-06-23 16:31
嗨py,

嗨py,

我想我不明白的东西。DA14580如何成为I2C奴隶,如果您必须主动检查硬件寄存器,也可以做其他事情。我想我不明白如何通过DA14580一般使用中断

特大号,

诺福尔

py_dialog.
离线
最后一次露面:2年9个月前
职员
加入:2014-08-25 09:59
嗨天钵,

嗨天钵,

ALI的代码是主模式I2C的目标。我认为你要求从事从动模式i2c吧?实际上,很少有人将在从属模式下使用我们的I2C,尽管我们可以支持从属模式状态机。因此,当时,从Slave模式I2C上没有文档或参考代码。如果可能的话,我会建议您选择UART或SPI。

问候!
PY

Jialin0450
离线
最后一次露面:5年11个月前
加入:2014-12-16 10:14
嗨,对话

嗨,对话
在I2C从模式中,如何启动中断?哪个注册表启用中断?