1 概要
この投稿は主にLPC54608 LINスレーブの基本的な使用法に関するもので、LPC54608 LINマスターの基本的な使用法に関する投稿と似ています。
NXP LPC54608 UARTモジュールにはすでにLINマスターとスレーブ機能があるため、この投稿では、LINアナライザーに関連付けられた簡単なスレーブコードとテスト結果を提供します。LINアナライザーをLINマスターとして使用し、LPC54608 LINスレーブとして使用すると、マスターは特定のIDフレーム(パブリッシュフレームとサブスクライブフレーム)をLINスレーブに送信し、LINスレーブ側からのフィードバックを待ちます。
2 LPC54608 LINスレーブの例
次に、LPCXpresso54608ボードをLINスレーブとして使用します。 PCAN-USB Pro FD LINアナライザーをLINマスターとして、ハードウェア接続とLINスレーブに関する簡単なソフトウェアコードを提供します。
2.1 ハードウェア要件
ハードウェア:LPCXpresso54608、TRK-KEA8、PCAN-USB Pro FD(LINアナライザー)、12V DC電源
LINバス電圧は12Vですが、LPCXpresso54608ボードにはオンボードLINトランシーバーチップがないため、LINトランシーバーチップを含む外部ボードを見つける必要があります、ここではTRK-KEA8を使用します、このボードにはすでにMC33662LEF LINトランシーバー、またはLPC54608 LINマスターポストに記載されているボードKIT33662LEFEVBがあります。TRK-KEA8のMC33662LEF LINトランシーバー回路は、次のようにします。
図2-1。LINトランシーバーの概略図
2.1.1LPCXpresso54608 および TRK-KEA8 接続
LPCXpresso54608 UARTポートはLINトランシーバーに接続する必要があります。
No. | LPCXプレッソ54608 | TRK-KEA8 | 注意 |
1 | P4_RX | J10-5 | UART0_RX |
2 | P4_TX | J10-6 | UART0_TX |
3 | P4_GND | J14-1 | GNDの |
2.1.2TRK-KEA8とLINマスターアナライザーの接続
LINアナライザのLINバスはTRK-KEA8のLINバスに接続されています。
LINアナライザGNDはTRK-KEA8 GNDに接続されています。
12Vで駆動されるTRK-KEA8 P1ポート、LINマスターアナライザーのVbatピンも12Vに接続する必要があります。
TRK-KEA8 J13_2 3.3V DC電源に接続する必要がありますが、TRK-KEA8は5Vと12Vであるため、J13_2を接続するために別の3.3V電源を見つける必要があるため、ここではFRDM-KL43を3.3V電源として使用します。LINトランシーバーが3.3Vを入力し、3.3V信号をUARTポートに出力できることを確認してください。
2.1.3 物理接続
2.2 ソフトウェアの流れとコード
このパートでは、LINパブリッシャデータとLINマスターとスレーブ間のサブスクライバIDデータについて説明します。このコードは、SDK LPCXpresso54608 usart割り込みプロジェクトに基づいて変更されています。
2.2.1 ソフトウェアフローチャート
2.2.2 ソフトウェアコード
コードは SDK_2.3.0_LPCXpresso54608 に基づいて変更されますUSART割り込み、変更されたコードは次のとおりです。
void DEMO_USART_IRQHandler(void)
{
if(DEMO_USART->STAT & USART_INTENSET_DELTARXBRKEN_MASK) // detect LIN break
{
DEMO_USART->STAT |= USART_INTENSET_DELTARXBRKEN_MASK;// clear the bit
Lin_BKflag = 1;
cnt = 0;
state = RECV_SYN;
DisableLinBreak;
}
if((kUSART_RxFifoNotEmptyFlag | kUSART_RxError) & USART_GetStatusFlags(DEMO_USART))
{
USART_ClearStatusFlags(DEMO_USART,kUSART_TxError | kUSART_RxError);
rxbuff[cnt] = USART_ReadByte(DEMO_USART);;
switch(state)
{
case RECV_SYN:
if(0x55 == rxbuff[cnt])
{
state = RECV_PID;
}
else
{
state = IDLE;
DisableLinBreak;
}
break;
case RECV_PID:
if(0xAD == rxbuff[cnt])
{
state = RECV_DATA;
}
else if(0XEC == rxbuff[cnt])
{
state = SEND_DATA;
}
else
{
state = IDLE;
DisableLinBreak;
}
break;
case RECV_DATA:
recdatacnt++;
if(recdatacnt >= 4) // 3 Bytes data + 1 Bytes checksum
{
recdatacnt=0;
state = RECV_SYN;
EnableLinBreak;
}
break;
default:break;
}
cnt++;
}
/* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
exception return operation might vector to incorrect interrupt */
#if defined __CORTEX_M && (__CORTEX_M == 4U)
__DSB();
#endif
}
/*!
* @brief Main function
*/
int main(void)
{
usart_config_t config;
/* attach 12 MHz clock to FLEXCOMM0 (debug console) */
CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
BOARD_InitPins();
BOARD_BootClockFROHF48M();
BOARD_InitDebugConsole();
/*
* config.baudRate_Bps = 19200U;
* config.parityMode = kUSART_ParityDisabled;
* config.stopBitCount = kUSART_OneStopBit;
* config.loopback = false;
* config.enableTxFifo = false;
* config.enableRxFifo = false;
*/
USART_GetDefaultConfig(&config);
config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE;
config.enableTx = true;
config.enableRx = true;
USART_Init(DEMO_USART, &config, DEMO_USART_CLK_FREQ);
/* Enable RX interrupt. */
DEMO_USART->INTENSET |= USART_INTENSET_DELTARXBRKEN_MASK; //USART_INTENSET_STARTEN_MASK |
USART_EnableInterrupts(DEMO_USART, kUSART_RxLevelInterruptEnable | kUSART_RxErrorInterruptEnable);
EnableIRQ(DEMO_USART_IRQn);
while (1)
{
if(state == SEND_DATA)
{
while (kUSART_TxFifoNotFullFlag & USART_GetStatusFlags(DEMO_USART))
{
USART_WriteByte(DEMO_USART, 0X01);
break; //just send one byte, otherwise, will send 16 bytes
}
while (kUSART_TxFifoNotFullFlag & USART_GetStatusFlags(DEMO_USART))
{
USART_WriteByte(DEMO_USART, 0X02);
break; //just send one byte, otherwise, will send 16 bytes
}
while (kUSART_TxFifoNotFullFlag & USART_GetStatusFlags(DEMO_USART))
{
USART_WriteByte(DEMO_USART, 0X10);// 0X10 correct 0Xaa wrong
break; //just send one byte, otherwise, will send 16 bytes
}
recdatacnt=0;
state = RECV_SYN;
EnableLinBreak;
}
}
}
3 LPC54608 LINスレーブテスト結果
マスターは 2 つのフレームを定義します。
無条件ID | 保護されたID | 方向 | データ | チェックサム |
0x2C | 0XEC | 加入者 | 0x01,0x02 | 0x10 |
0x2D | 0XAD | 発行者 | 0x01,0x02,0x03 | 0x4c |
ここで、LINマスターは上記の2つのフレームをスレーブLINに送信し、テスト結果とLINバスからの波を提供します。
3.1 LINマスター構成
Uartボーレートは19200bps
3.2 0X2C,0X2Dフレームの送信
上記のテスト結果から、正常に送信0X2D、LIN保存側からデータを受信できる0X2C、受信したデータは0X01、0X02、チェックサムが0x10ことがわかります。
3.2.1 0X2DフレームLINバスウェーブとデバッグ結果
LINスレーブのデバッグ結果から、LINスレーブはLINマスターから正しいデータを受信でき、チェック後、チェックサムも正しいことがわかります。
3.2.20X2CフレームLINバスウェーブ
LINマスターツールのインターフェースから、スレーブが間違ったチェックサム0XAAを出したかどうかを見つけることができ、マスターもチェックサムが間違っていることを見つけることができます。
これは、チェックサムが間違っている LIN バス ウェーブです。
上記のテスト結果から、LINスレーブLPC54608見つけ、正しいLINバスデータを受信し、正しいLINデータをマスターに送り返すことができます。