在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用LPC55S28 I2C從機(jī)功能,接收不定長(zhǎng)的數(shù)據(jù)(通過(guò)字節(jié)數(shù)或者STOP條件判斷)

li1756686189 ? 來(lái)源:嵌入式 MCU ? 2023-01-13 10:12 ? 次閱讀

使用LPC55S28的I2C從機(jī)接口,比如實(shí)現(xiàn) 24LC系列的從機(jī)EEPROM 。可以提供以下操作,如字節(jié)寫(xiě)入、頁(yè)面寫(xiě)入、當(dāng)前地址讀取、隨機(jī)讀取和順序讀取。接下來(lái),使用Byte Write和Random Read作為示例來(lái)說(shuō)明。首先明確需要判斷的狀態(tài),包括以下內(nèi)容:數(shù)據(jù)和地址-- 用于確定接收到的地址或數(shù)據(jù)。起始位-- 用于判斷是否接收到起始位。讀寫(xiě)-- 用于判斷是寫(xiě)狀態(tài)還是讀狀態(tài)。

隨機(jī)讀取

如果從設(shè)備生成kI2C_SlaveAddressMatchEvent,則表示從設(shè)備檢測(cè)到主設(shè)備發(fā)送的啟動(dòng)或重復(fù)啟動(dòng)。可以在程序中設(shè)置一個(gè)變量,記錄它是啟動(dòng)還是重復(fù)啟動(dòng),并根據(jù)傳輸情況合理設(shè)置該變量的值。假設(shè)從設(shè)備檢測(cè)到啟動(dòng),那么根據(jù)接受容量字節(jié)大小,接收到兩個(gè)字節(jié)或三個(gè)字節(jié),那么第一個(gè)字節(jié)是包含讀寫(xiě)操作的設(shè)備的地址,第二個(gè)和第三個(gè)字(如果存在)是要操作的數(shù)據(jù)的地址。接下來(lái),LPC5528將再次檢測(cè)啟動(dòng),即再次接收具有讀取操作的設(shè)備地址。LPC5528從相應(yīng)的數(shù)據(jù)地址讀取數(shù)據(jù)并將其返回給主機(jī)。

174e1536-9296-11ed-bfe3-dac502259ad0.png

字節(jié)寫(xiě)

如果從設(shè)備生成kI2C_SlaveAddressMatchEvent,則表示從設(shè)備檢測(cè)到主設(shè)備發(fā)送的啟動(dòng)或重復(fù)啟動(dòng)。可以在程序中設(shè)置一個(gè)變量,記錄它是啟動(dòng)還是重復(fù)啟動(dòng),并根據(jù)傳輸情況合理設(shè)置該變量的值。假設(shè)從設(shè)備檢測(cè)到啟動(dòng),那么根據(jù)接收容量大小,接收到兩個(gè)字節(jié)或三個(gè)字節(jié),那么第一個(gè)字節(jié)是包含讀寫(xiě)操作的設(shè)備的地址,第二個(gè)和第三個(gè)字(如果存在)是要操作的數(shù)據(jù)的地址。緊隨其后的字節(jié)是數(shù)據(jù)。將此數(shù)據(jù)字節(jié)保存到上一步驟中獲得的地址中。

1766365c-9296-11ed-bfe3-dac502259ad0.png

當(dāng)主機(jī)設(shè)置STOP條件停止傳輸?shù)臅r(shí)候,從機(jī)端需要獲得一個(gè)提醒。可以參考例程"i2c_interrupt_b2b_transfer_slave.c" 實(shí)現(xiàn)基于I2C從機(jī)的例子。

177e05a2-9296-11ed-bfe3-dac502259ad0.png

179a525c-9296-11ed-bfe3-dac502259ad0.png

I2C驅(qū)動(dòng)的狀態(tài)機(jī)設(shè)置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 */
casekI2C_SlaveCompletionEvent:
g_SlaveCompletionFlag = true;
break;

default:
g_SlaveCompletionFlag = false;
break;
}

}

如果主機(jī)發(fā)送一定數(shù)據(jù)后,判斷分支casekI2C_SlaveCompletionEvent將會(huì)執(zhí)行,同時(shí)g_SlaveCompletionFlag 標(biāo)志將會(huì)設(shè)置為 true。在SDK中,使用I2C_SlaveTransferNonBlocking 函數(shù),有判斷字節(jié)傳輸完成的動(dòng)作。

/* 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 這個(gè)分支的進(jìn)入不是根據(jù)主機(jī)發(fā)送的stop條件進(jìn)入的,而是根據(jù)字節(jié)數(shù)進(jìn)入的,譬如:如果主機(jī)發(fā)送256字節(jié),接收字節(jié)數(shù)定義為16,當(dāng)?shù)?6個(gè)數(shù)據(jù)接收完成后,就會(huì)進(jìn)入該分支。但是 I2C 從機(jī)端事先并不知道 I2C 主機(jī)發(fā)送的字節(jié)數(shù),所以無(wú)法判定停止。有什么辦法能判斷停止呢?

“API需要編寫(xiě)代碼判斷在I2C STOP停止時(shí)達(dá)到完成狀態(tài),而不是通過(guò)rxData計(jì)數(shù)到0。”參考示例代碼只顯示raData計(jì)數(shù)減到了0。如果要在停止時(shí)達(dá)到完成狀態(tài),在 i2c 從機(jī)回調(diào)函數(shù)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;
// 用戶(hù)代碼
break;

...

}
}

在傳輸函數(shù)中,需要添加kI2C_SlaveDeselectedEvent:

/* 在 I2C 從機(jī)外設(shè)中, 啟動(dòng)接收 I2C傳輸*/
reVal = I2C_SlaveTransferNonBlocking(EXAMPLE_I2C_SLAVE,&g_s_handle,kI2C_SlaveAddressMatchEvent | kI2C_SlaveCompletionEvent|kI2C_SlaveDeselectedEvent);

當(dāng) I2C主機(jī)發(fā)送 STOP,從機(jī)的STAT標(biāo)志將會(huì)設(shè)置為1,函數(shù) I2C_SlaveTransferHandleIRQ將會(huì)觸發(fā) kI2C_SlaveDeselectedEvent。查看驅(qū)動(dòng)代碼如下:

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 參考手冊(cè)第 637頁(yè)面有相關(guān)描述。

17ba3be4-9296-11ed-bfe3-dac502259ad0.png

審核編輯:湯梓紅。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8885

    瀏覽量

    152977
  • EEPROM
    +關(guān)注

    關(guān)注

    9

    文章

    1061

    瀏覽量

    83014
  • I2C
    I2C
    +關(guān)注

    關(guān)注

    28

    文章

    1514

    瀏覽量

    126528
  • 狀態(tài)機(jī)
    +關(guān)注

    關(guān)注

    2

    文章

    493

    瀏覽量

    27974
  • 從機(jī)
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    982

原文標(biāo)題:使用 LPC55S28 I2C 從機(jī)功能,接收不定長(zhǎng)的數(shù)據(jù)(通過(guò)字節(jié)數(shù)或者STOP條件判斷)

文章出處:【微信號(hào):嵌入式 MCU,微信公眾號(hào):嵌入式 MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    用STM32F030F4串口空閑中斷接收不定長(zhǎng)數(shù)據(jù),發(fā)生中斷后不知道如何計(jì)算接收到的字節(jié)數(shù)

    我用STM32F030F4串口空閑中斷接收不定長(zhǎng)數(shù)據(jù),發(fā)生中斷后不知道怎樣計(jì)算接收到的字節(jié)數(shù)
    發(fā)表于 04-03 07:12

    LPC55S28修改音頻數(shù)據(jù)格式后USB Aduio類(lèi)異常的原因?

    您好 NXP 前輩,我已經(jīng)更改了 LPC55S28 官方 SDK 上的 USB 音頻數(shù)據(jù)格式。 我的主要問(wèn)題是修改音頻流格式類(lèi)型描述符。 我的想法是將 USB Aduio 每個(gè)通道的數(shù)據(jù)字節(jié)數(shù)
    發(fā)表于 03-20 07:33

    STM32單片機(jī)接收不定長(zhǎng)字節(jié)數(shù)據(jù)的方法(適用于ARM單片機(jī)

    串口無(wú)非就是設(shè)置波特率、數(shù)據(jù)位、停止位、奇偶校驗(yàn)位。發(fā)送接收也就三種基本方式,輪詢(xún)、中斷和DMA。STM32F10x 的USART 模塊也不過(guò)如此。  STM32單片機(jī)接收
    發(fā)表于 05-27 07:00

    STM32單片機(jī)接收不定長(zhǎng)字節(jié)數(shù)據(jù)的方法

    串口無(wú)非就是設(shè)置波特率、數(shù)據(jù)位、停止位、奇偶校驗(yàn)位。發(fā)送接收也就三種基本方式,輪詢(xún)、中斷和DMA。STM32F10x 的USART 模塊也不過(guò)如此。  STM32單片機(jī)接收
    發(fā)表于 05-31 08:00

    STM32單片機(jī)接收不定長(zhǎng)字節(jié)數(shù)據(jù)的方法解析相關(guān)資料推薦

    http://m.elecfans.com/article/899756.html今天說(shuō)一下STM32單片機(jī)接收不定長(zhǎng)字節(jié)數(shù)據(jù)的方法。由于STM32單片
    發(fā)表于 07-01 09:41

    STM32單片機(jī)接收不定長(zhǎng)字節(jié)數(shù)據(jù)的方法

    STM32串口使用IDLE中斷接收不定長(zhǎng)數(shù)據(jù)原理與源程序轉(zhuǎn)載 2016年07月16日 18:20:24原文來(lái)自 今天說(shuō)一下STM32單片機(jī)接收
    發(fā)表于 08-04 09:05

    STM32單片機(jī)接收不定長(zhǎng)字節(jié)數(shù)據(jù)的方法

    最近用到stm32的串口,中斷一個(gè)字符一個(gè)字符接收好心累,網(wǎng)上度了一下發(fā)現(xiàn)了一篇好的帖子,和大家分享一下,再次感謝原貼樓主的分享,為了方便大家,我把原文復(fù)制過(guò)來(lái)》今天說(shuō)一下STM32單片機(jī)接收
    發(fā)表于 08-13 06:30

    STM32單片機(jī)接收不定長(zhǎng)字節(jié)數(shù)據(jù)的方法是什么

    IDLE中斷什么時(shí)候發(fā)生?如何配置好IDLE中斷?STM32單片機(jī)接收不定長(zhǎng)字節(jié)數(shù)據(jù)的方法是什么?
    發(fā)表于 10-19 07:00

    請(qǐng)問(wèn)STM32單片機(jī)如何接收不定長(zhǎng)字節(jié)數(shù)據(jù)

    IDLE中斷什么時(shí)候發(fā)生?STM32單片機(jī)如何接收不定長(zhǎng)字節(jié)數(shù)據(jù)
    發(fā)表于 10-25 06:46

    STM32串口接收不定長(zhǎng)字節(jié)數(shù)據(jù)的方法

    STM32串口接收不定長(zhǎng)字節(jié)數(shù)據(jù)的方法
    發(fā)表于 12-09 06:35

    STM32單片機(jī)是如何利用IDLE中斷接收不定長(zhǎng)字節(jié)數(shù)據(jù)

    IDLE中斷什么時(shí)候發(fā)生?如何配置好IDLE中斷?STM32單片機(jī)是如何利用IDLE中斷接收不定長(zhǎng)字節(jié)數(shù)據(jù)的?
    發(fā)表于 12-09 07:02

    STM32單片機(jī)接收不定長(zhǎng)字節(jié)數(shù)據(jù)的方法

    來(lái)說(shuō)一下STM32單片機(jī)接收不定長(zhǎng)字節(jié)數(shù)據(jù)的方法。由于STM32單片機(jī)帶IDLE中斷,所以利用這個(gè)中斷,可以
    發(fā)表于 01-06 08:04

    STM32單片機(jī)接收不定長(zhǎng)字節(jié)數(shù)據(jù)的方法解析

    IDLE就是串口收到一幀數(shù)據(jù)后,發(fā)生的中斷。什么是一幀數(shù)據(jù)呢?比如說(shuō)給單片機(jī)一次發(fā)來(lái)1個(gè)字節(jié)或者一次發(fā)來(lái)8個(gè)
    發(fā)表于 04-02 14:30 ?5524次閱讀
    STM32單片<b class='flag-5'>機(jī)</b><b class='flag-5'>接收</b><b class='flag-5'>不定長(zhǎng)</b>度<b class='flag-5'>字節(jié)數(shù)據(jù)</b>的方法解析

    單片機(jī)串口接收字節(jié)數(shù)據(jù)

    單片機(jī)串口接收字節(jié)數(shù)據(jù)
    發(fā)表于 11-17 09:51 ?42次下載
    單片<b class='flag-5'>機(jī)</b>串口<b class='flag-5'>接收</b>多<b class='flag-5'>字節(jié)數(shù)據(jù)</b>

    stm32 串口接收不定長(zhǎng)度數(shù)據(jù)及黏包處理 + 串口DMA接收

    1.不定長(zhǎng)度數(shù)據(jù) 為什么會(huì)存在串口接收不定長(zhǎng)度數(shù)據(jù)呢?首先,在通信雙方進(jìn)行數(shù)據(jù)傳輸?shù)臅r(shí)候,由于不同的設(shè)備在實(shí)現(xiàn)控制,數(shù)據(jù)采樣時(shí),發(fā)送的
    發(fā)表于 12-23 19:09 ?27次下載
    stm32 串口<b class='flag-5'>接收</b><b class='flag-5'>不定長(zhǎng)度數(shù)據(jù)</b>及黏包處理 + 串口DMA<b class='flag-5'>接收</b>
    主站蜘蛛池模板: 四虎国产精品影库永久免费 | 国产精品人成在线播放新网站 | 免费在线观看黄 | 精品一区 二区三区免费毛片 | 美女被强插 | 国产性较精品视频免费 | 国产精品亚洲一区二区三区在线播放 | 人人做人人爽人人爱 | 国模吧一区二区三区精品视频 | 好男人社区www的视频免费 | 色综合欧美 | 午夜嘿嘿| 欧美日韩一区二区不卡 | 日本免费大黄在线观看 | 国产成人经典三级在线观看 | 播放个毛片看看 | 一级看片 | www.a级片| 热99视频| 久久亚洲国产欧洲精品一 | 成在线人视频免费视频 | 女人本色高清在线观看wwwwww国产 | 男人的天堂色偷偷 | 日韩欧美色图 | 成人aaa| 大象焦伊人久久综合网色视 | 伊人久久大香线蕉综合电影 | 天天爱天天爽 | 亚洲国产欧美精品一区二区三区 | 一区免费视频 | 国产精品久久精品牛牛影视 | 国产一卡二卡3卡4卡四卡在线 | 天堂资源bt | 欧美性色黄在线视 | 激情综合色五月丁香六月亚洲 | 国产综合久久久久影院 | 国产免费久久精品99 | 美女张开腿让男生桶出水 | 夜夜春夜夜夜夜猛噜噜噜噜噜 | 午夜影院0606免费 | 六月激情丁香 |