精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用LPC55S28 I2C從機功能,接收不定長的數據(通過字節數或者STOP條件判斷)

li1756686189 ? 來源:嵌入式 MCU ? 2023-01-13 10:12 ? 次閱讀

使用LPC55S28的I2C從機接口,比如實現 24LC系列的從機EEPROM 。可以提供以下操作,如字節寫入、頁面寫入、當前地址讀取、隨機讀取和順序讀取。接下來,使用Byte Write和Random Read作為示例來說明。首先明確需要判斷的狀態,包括以下內容:數據和地址-- 用于確定接收到的地址或數據。起始位-- 用于判斷是否接收到起始位。讀寫-- 用于判斷是寫狀態還是讀狀態。

隨機讀取

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

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

字節寫

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

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

當主機設置STOP條件停止傳輸的時候,從機端需要獲得一個提醒。可以參考例程"i2c_interrupt_b2b_transfer_slave.c" 實現基于I2C從機的例子。

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

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

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 */
casekI2C_SlaveCompletionEvent:
g_SlaveCompletionFlag = true;
break;

default:
g_SlaveCompletionFlag = false;
break;
}

}

如果主機發送一定數據后,判斷分支casekI2C_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頁面有相關描述。

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

審核編輯:湯梓紅。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8526

    瀏覽量

    150863
  • EEPROM
    +關注

    關注

    9

    文章

    1010

    瀏覽量

    81414
  • I2C
    I2C
    +關注

    關注

    28

    文章

    1482

    瀏覽量

    123358
  • 狀態機
    +關注

    關注

    2

    文章

    492

    瀏覽量

    27486
  • 從機
    +關注

    關注

    0

    文章

    3

    瀏覽量

    855

原文標題:使用 LPC55S28 I2C 從機功能,接收不定長的數據(通過字節數或者STOP條件判斷)

文章出處:【微信號:嵌入式 MCU,微信公眾號:嵌入式 MCU】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    用STM32F030F4串口空閑中斷接收不定長數據,發生中斷后不知道如何計算接收到的字節數

    我用STM32F030F4串口空閑中斷接收不定長數據,發生中斷后不知道怎樣計算接收到的字節數
    發表于 04-03 07:12

    STM32單片接收不定長字節數據的方法(適用于ARM單片

    串口無非就是設置波特率、數據位、停止位、奇偶校驗位。發送接收也就三種基本方式,輪詢、中斷和DMA。STM32F10x 的USART 模塊也不過如此。  STM32單片接收
    發表于 05-27 07:00

    STM32單片接收不定長字節數據的方法

    串口無非就是設置波特率、數據位、停止位、奇偶校驗位。發送接收也就三種基本方式,輪詢、中斷和DMA。STM32F10x 的USART 模塊也不過如此。  STM32單片接收
    發表于 05-31 08:00

    STM32單片接收不定長字節數據的方法解析相關資料推薦

    http://m.elecfans.com/article/899756.html今天說一下STM32單片接收不定長字節數據的方法。由于STM32單片
    發表于 07-01 09:41

    STM32單片接收不定長字節數據的方法

    STM32串口使用IDLE中斷接收不定長數據原理與源程序轉載 2016年07月16日 18:20:24原文來自 今天說一下STM32單片接收
    發表于 08-04 09:05

    STM32單片接收不定長字節數據的方法

    最近用到stm32的串口,中斷一個字符一個字符接收好心累,網上度了一下發現了一篇好的帖子,和大家分享一下,再次感謝原貼樓主的分享,為了方便大家,我把原文復制過來》今天說一下STM32單片接收
    發表于 08-13 06:30

    STM32單片接收不定長字節數據的方法是什么

    IDLE中斷什么時候發生?如何配置好IDLE中斷?STM32單片接收不定長字節數據的方法是什么?
    發表于 10-19 07:00

    請問STM32單片如何接收不定長字節數據

    IDLE中斷什么時候發生?STM32單片如何接收不定長字節數據
    發表于 10-25 06:46

    STM32串口接收不定長字節數據的方法

    STM32串口接收不定長字節數據的方法
    發表于 12-09 06:35

    STM32單片是如何利用IDLE中斷接收不定長字節數據

    IDLE中斷什么時候發生?如何配置好IDLE中斷?STM32單片是如何利用IDLE中斷接收不定長字節數據的?
    發表于 12-09 07:02

    STM32單片接收不定長字節數據的方法

    來說一下STM32單片接收不定長字節數據的方法。由于STM32單片帶IDLE中斷,所以利用這個中斷,可以
    發表于 01-06 08:04

    STM32單片接收不定長字節數據的方法解析

    IDLE就是串口收到一幀數據后,發生的中斷。什么是一幀數據呢?比如說給單片一次發來1個字節或者一次發來8個
    發表于 04-02 14:30 ?5312次閱讀
    STM32單片<b class='flag-5'>機</b><b class='flag-5'>接收</b><b class='flag-5'>不定長</b>度<b class='flag-5'>字節數據</b>的方法解析

    單片串口接收字節數據

    單片串口接收字節數據
    發表于 11-17 09:51 ?42次下載
    單片<b class='flag-5'>機</b>串口<b class='flag-5'>接收</b>多<b class='flag-5'>字節數據</b>

    stm32 串口接收不定長度數據及黏包處理 + 串口DMA接收

    1.不定長度數據 為什么會存在串口接收不定長度數據呢?首先,在通信雙方進行數據傳輸的時候,由于不同的設備在實現控制,數據采樣時,發送的
    發表于 12-23 19:09 ?27次下載
    stm32 串口<b class='flag-5'>接收</b><b class='flag-5'>不定長度數據</b>及黏包處理 + 串口DMA<b class='flag-5'>接收</b>

    I2C數據傳輸的三個主要API

    _client *client,char *buf,int count) client:I2C 設備對應的 i2c_client。 buf:要接收數據。 count:要
    的頭像 發表于 07-22 15:04 ?1455次閱讀
    <b class='flag-5'>I2C</b><b class='flag-5'>數據</b>傳輸的三個主要API