使用LPC55S28 I2C从机功能,接收不定长的数据(通过字节数或者STOP条件判断)

使用lpc55s28的i2c从机接口,比如实现 24lc系列的从机eeprom 。可以提供以下操作,如字节写入、页面写入、当前地址读取、随机读取和顺序读取。接下来,使用byte write和random read作为示例来说明。首先明确需要判断的状态,包括以下内容:数据和地址-- 用于确定接收到的地址或数据。起始位-- 用于判断是否接收到起始位。读写-- 用于判断是写状态还是读状态。 
随机读取
如果从设备生成ki2c_slaveaddressmatchevent,则表示从设备检测到主设备发送的启动或重复启动。可以在程序中设置一个变量,记录它是启动还是重复启动,并根据传输情况合理设置该变量的值。假设从设备检测到启动,那么根据接受容量字节大小,接收到两个字节或三个字节,那么第一个字节是包含读写操作的设备的地址,第二个和第三个字(如果存在)是要操作的数据的地址。接下来,lpc5528将再次检测启动,即再次接收具有读取操作的设备地址。lpc5528从相应的数据地址读取数据并将其返回给主机。
字节写
如果从设备生成ki2c_slaveaddressmatchevent,则表示从设备检测到主设备发送的启动或重复启动。可以在程序中设置一个变量,记录它是启动还是重复启动,并根据传输情况合理设置该变量的值。假设从设备检测到启动,那么根据接收容量大小,接收到两个字节或三个字节,那么第一个字节是包含读写操作的设备的地址,第二个和第三个字(如果存在)是要操作的数据的地址。紧随其后的字节是数据。将此数据字节保存到上一步骤中获得的地址中。
当主机设置stop条件停止传输的时候,从机端需要获得一个提醒。可以参考例程i2c_interrupt_b2b_transfer_slave.c 实现基于i2c从机的例子。
i2c驱动的状态机设置xfer->rxsize 和xfer->txsize 变量。
static void i2c_slave_callback(i2c_type *base, volatile i2c_slave_transfer_t *xfer, void *userdata)
{
    switch (xfer->event)
    {
        /*  address match event */
        case ki2c_slaveaddressmatchevent:
            xfer->rxdata = null;
            xfer->rxsize = 0;
            break;
        /*  transmit request */
        case ki2c_slavetransmitevent:
            /*  update information for transmit process */
            xfer->txdata = &g_slave_buff[2];
            xfer->txsize = g_slave_buff[1];
            break;
/* setup the slave receive buffer */
        case ki2c_slavereceiveevent:
            /*  update information for received process */
            xfer->rxdata = g_slave_buff;
            xfer->rxsize = i2c_data_length;
            break;
/* the master has sent a stop transition on the bus */
        case ki2c_slavecompletionevent:
            g_slavecompletionflag = true;
            break;
default:
            g_slavecompletionflag = false;
            break;
    }
}
    如果主机发送一定数据后,判断分支case ki2c_slavecompletionevent 将会执行,同时 g_slavecompletionflag 标志将会设置为 true。在sdk中,使用i2c_slavetransfernonblocking 函数,有判断字节传输完成的动作。
/* start accepting i2c transfers on the i2c slave peripheral */
reval = i2c_slavetransfernonblocking(example_i2c_slave, &g_s_handle,
ki2c_slaveaddressmatchevent | ki2c_slavecompletionevent);
if (reval != kstatus_success)
{
return -1;
}
/* wait for transfer completed. */
while (!g_slavecompletionflag)
{
}
g_slavecompletionflag = false;
    case k2ic_slavecompletionevent 这个分支的进入不是根据主机发送的stop条件进入的,而是根据字节数进入的,譬如:如果主机发送256字节,接收字节数定义为16,当第16个数据接收完成后,就会进入该分支。但是 i2c 从机端事先并不知道 i2c 主机发送的字节数,所以无法判定停止。有什么办法能判断停止呢?
    “api需要编写代码判断在i2c stop停止时达到完成状态,而不是通过rxdata计数到0。”参考示例代码只显示radata计数减到了0。如果要在停止时达到完成状态,在 i2c 从机回调函数i2c_slave_callback中,需要添加case ki2c_slavedeselectedevent。
static void i2c_slave_callback(i2c_type*base, volatile i2c_slave_transfer_t *xfer, void *userdata)
{
switch (xfer->event)
    {
...
  caseki2c_slavedeselectedevent:
                  g_slavecompletionflag = true;
        //        用户代码
                  break;
...
}
}
    在传输函数中,需要添加 ki2c_slavedeselectedevent:
/* 在 i2c 从机外设中, 启动接收 i2c传输 */
    reval = i2c_slavetransfernonblocking(example_i2c_slave,&g_s_handle, ki2c_slaveaddressmatchevent | ki2c_slavecompletionevent|ki2c_slavedeselectedevent);
    当 i2c主机发送 stop,从机的stat标志将会设置为1,函数 i2c_slavetransferhandleirq将会触发 ki2c_slavedeselectedevent。查看驱动代码如下 :
void i2c_slavetransferhandleirq(i2c_type *base,i2c_slave_handle_t *handle)
{
uint32_t i2cstatus = base->stat;
if (i2cstatus &i2c_stat_slvdesel_mask)
    {
        i2c_slaveinvokeevent(base, handle,ki2c_slavedeselectedevent);
        i2c_slaveclearstatusflags(base,i2c_stat_slvdesel_mask);
    }
...
}
    在 lpc55 参考手册第 637页面有相关描述。


智慧水务监控系统解决方案
PSoC单片机及其茌燃气变频输配与流量计量中的应用
三星将手机生产全面转向印度 2019年中国市场前景可能更加不容乐观
这款清理冰箱的智能机器人只有半罐可乐大小
iphone8什么时候上市?iphone 8即将发布,各种新功能和黑科技!望第一时间上5G网络?
使用LPC55S28 I2C从机功能,接收不定长的数据(通过字节数或者STOP条件判断)
豆豆机器人空间站落地深圳,为AI和机器人产业输送后备人才做准备
使用FSP配置RA的CAN模块(下)
2021年的机器学习进入新阶段:量子机器学习
炒币浪潮过后的区块链能给未来带来什么
基于LonWorks的在系统编程技术
采用LabVIEW的图形化程序语言实现数字仪表测试系统的设计
美格智能出席首届5G+煤矿智能化高峰论坛并展示了5G系列模组产品
通过RT-Thread Studio配置AB32VG1片上外设GPIO引脚控制RGB彩灯
全新iPad Pro系列大翻新,推迟至5月发售:无边框显示屏+无Home键
激光剥线在医疗电子行业中的应用
CS201 Type-C拓展坞音频转换芯片|CS201 USB声卡芯片|USB音频转换芯片方案
工控机产业与时俱进正在步入高速发展阶段
AMD更新一款A6-9400处理器 CPU配置为双核加速频率3.7GHz
天龙股份:参股芯片公司尚未盈利,股票存在非理性炒作风险