こんにちは、
S32K3x8EV8ボードのCAN0またはCAN1を使うコードを実行しようとしていますが、できません。しかしCANは全く動作せず、Waveshare USB-CAN-AでCANメッセージを読み取ろうとしています。
コードも貼り付けました。CAN設定のスクリーンショットを追加してください。
/*
* 著作権 2019 NXP
*
* 無断転載を禁じます。
*
* このソフトウェアはNXPによって「現状通り」および明示されたものまたは
* 黙示の保証(黙示の保証を含むが、これに限定されない)
* 商品性および特定目的への適合性に関する保証は一切いたしません。
* いかなる場合もNXPまたはその寄付者は、いかなる直接的な責任も負いません。
* 間接的、偶発的、特別、懲罰的、または結果的な損害
* (代替品の調達を含むがこれに限定されない)
* サービス、使用不能、データ損失、利益損失、または事業中断)
* 原因の如何を問わず、また契約に基づくか否かを問わず、いかなる責任理論に基づく場合であっても、
* 厳格責任、または不法行為(過失その他を含む)の発生
* 本ソフトウェアのいかなる形でも、たとえ助言されていても使用しないでください
* そのような損害が発生する可能性。
*/
/* ###################################################################
********************************************************************************
* ファイル: main.c
* オーナー:ペトル・スタンチク
* バージョン: 1.0
* 日付: 2024年10月22日
* 分類:一般ビジネス情報
* 概要:FlexCAN TX/RX ISRテスト
*
********************************************************************************
********************************************************************************
このデモアプリケーションの目的は、FlexCANモジュールの使い方を示すことです
S32 RTD APIを用いてCAN FDを使用するよう設定されています。
- このデモアプリケーションは2枚のボード、またはCANツールに接続された1枚のボードを必要とします。
- CAN FDはビットレート500/2000 kbpsで有効です
- FlexCAN0モジュールとそのトランシーバ(TJA1153)を構成します。
- MB0はCANFD標準IDの送信に使用されます。
MB1は任意の標準IDを受信するように構成されています。
- コールバック関数は、MBにおけるTXおよびRXプロセスを処理するためにも使用されます。受信したIDは
反響した。
- setupCanXCVR関数はInitに呼び出されTJA1153ボード上のFlexCAN0に接続されます。
トランシーバをバニラ状態にすることを期待し、TPLがすべてのstdおよびext IDを通過するように設定しています。
バスから届くメッセージを遮断しないでください。最後に設定モードを終了します
不揮発性メモリへの書き込みやトランシーバのロックなしに。
*
* ------------------------------------------------------------------------------
* テスト用ハードウェア: S32K3X8EVB-Q289 rev B2
* MCU:P32K358HVS 0P14E
* コンパイラ:S32DS。ARM.3.5
* SDK リリース:S32K3_RTD_4.0.0_D2311
* デバッガー: Lauterbach
* 対象: internal_FLASH
*
********************************************************************************
変更履歴:
1.0 2024年10月22日Petr Stancik RTD FlexCAN_Ip_exampleに基づく初期バージョン
*******************************************************************************/
/* 必要な設定ファイルを含めます。*/
#include "Mcal.h"
#include "Clock_Ip.h"
#include "FlexCAN_Ip.h"
#include "IntCtrl_Ip.h"
#include "Siul2_Port_Ip_Cfg.h"
#include "Siul2_Dio_Ip_Cfg.h"
#include "Siul2_Dio_Ip.h"
#include "Siul2_Port_Ip.h"
#include "OsIf.h"
#define MSG_ID 20u
#define RX_MB_IDX 1U
#define TX_MB_IDX 0U
volatile int exit_code = 0 ;
/* ユーザーには */ が含まれています
Flexcan_Ip_DataInfoType tx_info = {
. msg_id_type = FLEXCAN_MSG_ID_STD 、
. data_length = 1 u 、
. fd_enable = FALSE 、
. fd_padding = FALSE 、
.enable_brs = FALSE 、
. is_polling = FALSE 、
. is_remote = FALSE
} ;
Flexcan_Ip_DataInfoType rx_info = {
. msg_id_type = FLEXCAN_MSG_ID_STD 、
. data_length = 1 u 、
. fd_enable = FALSE 、
. fd_padding = FALSE 、
.enable_brs = FALSE 、
. is_polling = FALSE 、
. is_remote = FALSE
} ;
Flexcan_Ip_MsgBuffType rxData ;
uint8 dummyData [ 8 ] ;
volatile uint32 g_canErrorStatus = 0 ; /* デバッガ監視用のライブ ESR1 スナップショット */
volatile Flexcan_Ip_StatusType g_tja1153Status[3]; /* [0]=auto-baud, [1]=FEC whitelist, [2]=exit config */
/*!
\brief プロジェクトの主な機能。
\details 起動時の初期化シーケンスは以下のとおりです。
* - スタートアップアセンブリルーチン
* - 主要()
*/
extern void CAN0_ORED_0_31_MB_IRQHandler ( void ) ;
void setupCanXCVR_TJA1153 ( void ) ;
static void CAN_DelayMs ( uint32 ms )
{
uint32 ticks = OsIf_MicrosToTicks ( ms * 1000 U , FLEXCAN_IP_SERVICE_TIMEOUT_TYPE ) ;
uint32 start = OsIf_GetCounter ( FLEXCAN_IP_SERVICE_TIMEOUT_TYPE ) ;
uint32 elapsed = 0 U ;
while (経過時間< ticks )
{
elapsed += OsIf_GetElapsed ( & start , FLEXCAN_IP_SERVICE_TIMEOUT_TYPE ) ;
}
}
void flexcan0_Callback ( uint8 instance , Flexcan_Ip_EventType eventType , uint32 buffIdx ,
const Flexcan_Ip_StateType * flexcanState )
{
( void ) flexcanState ;
( void )インスタンス;
switch(eventType)
{
CASE FLEXCAN_EVENT_RX_COMPLETE:
dummyData [ 0 ] ++;
if ( buffIdx == 1 ) // MB1 を受信
{
FlexCAN_Ip_Send ( INST_FLEXCAN_0 、 TX_MB_IDX 、 & tx_info 、 rxData . msgId 、( uint8 * ) & dummyData ) ;
FlexCAN_Ip_Receive ( INST_FLEXCAN_0 , RX_MB_IDX , & rxData , false ) ;
}
壊す;
CASE FLEXCAN_EVENT_RXFIFO_COMPLETE:
壊す;
CASE FLEXCAN_EVENT_TX_COMPLETE:
壊す;
CASE FLEXCAN_EVENT_ENHANCED_RXFIFO_COMPLETE:
壊す;
CASE FLEXCAN_EVENT_ENHANCED_RXFIFO_WATERMARK:
壊す;
デフォルト:
壊す;
}
}
void setupCanXCVR_TJA1153 ( void )
{
/**
* TJA1153トランシーバは、ほとんどのCANトランシーバのようにすぐに使える状態ではない
* 以前に設定されていない場合は、最初に設定モードに入ります。
* この初期状態では、追加のセキュリティを受ける準備ができています
* 例えば、TPL/BBLのようなセットアップ。
*
この例では、TPL はすべての標準 IDと外部ID を渡すように設定され、メッセージをブロックしません。
* バスから降りてきたところ。最後に、不揮発性メモリに書き込まずに設定モードを終了します。
* メモリもトランシーバのロックもしない。
*
* 詳細については、NXP社のTJA1153データシートを参照してください。
*
*/
#define TJA1153_START_ID (uint32_t)(0x555u)
#define TJA1153_CONFIG_ID (uint32_t)(0x18DA00F1u)
uint8 sendData [ 8 ] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ;
uint32_tエラー;
/* ローカルホストから TXD ピン経由で CAN0 トランシーバの設定を許可、STB = 0 (PTC20) */
Siul2_Dio_Ip_WritePin ( PTC_H_HALF , 4 , 0 U ) ;
CAN_DelayMs ( 1000 ) ;
自動ビットレート検出 初期CANクラシックフレーム(ID 0x555 CAN0 */
tx_info.is_polling = TRUE ;
tx_info.msg_id_type = FLEXCAN_MSG_ID_STD ;
tx_info.data_length = 8 ;
g_tja1153Status [ 0 ] = FlexCAN_Ip_SendBlocking ( INST_FLEXCAN_0 , TX_MB_IDX , & tx_info , TJA1153_START_ID , sendData , 1000 ) ;
/* 送信ホワイトリストを設定するためのフィルタ要素構成 (FEC) フレーム。
* 注: ID_TX は NXP リファレンス サンプルのプレースホルダー (0xC0FFEE) であり、MSG_ID ではありません。
* これは単一の拡張 ID のみをホワイトリストに登録します。まずこのベースラインが機能することを確認してください。
* 次に、TJA1153データシートに従って、実際のIDに合わせてID_TX/Extended_Filter_Configを調整してください。*/
{
uint32_t ID_Stinger = TJA1153_CONFIG_ID ;
uint32_t PAYLOAD_FEC [ 2 ] ;
uint8_t COMMAND_BYTE_FEC = 0x10 ;
uint8_t Filter_Element_Index_0 = 0 ;
uint8_t Filter_Element_Type = 1 ;
uint8_t Extended_Filter_Config = 3 ; /* TWLとBBLの両方 */
uint32_t ID_TX = 0xC0FFEE ;
uint32_t Filter_Element_Contents = ( Extended_Filter_Config << 29 ) | ID_TX ;
PAYLOAD_FEC [ 0 ] = ( COMMAND_BYTE_FEC << 24 ) | ( Filter_Element_Index_0 << 16 ) |
( Filter_Element_Type << 15 ) | ( Filter_Element_Contents >> 16 ) ;
PAYLOAD_FEC [ 1 ] = ( Filter_Element_Contents & 0xFFFF ) << 16 ;
sendData [ 0 ] = ( uint8 )(( PAYLOAD_FEC [ 0 ] >> 24 ) & 0xFF U ) ;
sendData [ 1 ] = ( uint8 )(( PAYLOAD_FEC [ 0 ] >> 16 ) & 0xFF U ) ;
sendData [ 2 ] = ( uint8 )(( PAYLOAD_FEC [ 0 ] >> 8 ) & 0xFF U ) ;
sendData [ 3 ] = ( uint8 )( PAYLOAD_FEC [ 0 ] & 0xFF U ) ;
sendData [ 4 ] = ( uint8 )(( PAYLOAD_FEC [ 1 ] >> 24 ) & 0xFF U ) ;
sendData [ 5 ] = ( uint8 )(( PAYLOAD_FEC [ 1 ] >> 16 ) & 0xFF U ) ;
tx_info.msg_id_type = FLEXCAN_MSG_ID_EXT ;
tx_info.data_length = 6 ;
g_tja1153Status [ 1 ] = FlexCAN_Ip_SendBlocking ( INST_FLEXCAN_0 , TX_MB_IDX , & tx_info , ID_Stinger , sendData , 1000 ) ;
CAN_DelayMs ( 5 ) ;
}
/* 不揮発性メモリに書き込まずに構成モードを終了するための最後のコマンドフレーム
* トランシーバをロックする、すなわち開発モード */
sendData [ 0 ] = 0x71 ; // コマンドバイト
sendData [ 1 ] = 0x2 ;
sendData [ 2 ] = 0x3 ;
sendData [ 3 ] = 0x4 ;
sendData [ 4 ] = 0x5 ;
sendData [ 5 ] = 0x6 ;
sendData [ 6 ] = 0x7 ;
sendData [ 7 ] = 0x8 ;
tx_info.msg_id_type = FLEXCAN_MSG_ID_EXT ;
tx_info.data_length = 8 ;
g_tja1153Status [ 2 ] = FlexCAN_Ip_SendBlocking ( INST_FLEXCAN_0 , TX_MB_IDX , & tx_info , TJA1153_CONFIG_ID , sendData , 1000 ) ;
/* 最後のフレーム終了後、トランシーバは設定モードを終了し、スタンバイモードに入り、終了します
* 通常動作モードへの切り替えは、CAN0トランシーバのSTBピンをHIGHに設定することで行われます(ピンは無効化) */
Siul2_Dio_Ip_WritePin ( PTC_H_HALF , 4 , 1 U ) ;
CAN_DelayMs ( 1000 ) ;
errors = FlexCAN_Ip_GetErrorStatus ( INST_FLEXCAN_0 ) ;
FlexCAN_Ip_ClearErrorStatus ( INST_FLEXCAN_0 , errors ) ;
}
int main ( void )
{
/* ここにコードを記述してください */
Clock_Ip_Init ( & Clock_Ip_aClockConfig [ 0 ]) ;
Siul2_Port_Ip_Init ( NUM_OF_CONFIGURED_PINS0 , g_pin_mux_InitConfigArr0 ) ;
IntCtrl_Ip_EnableIrq ( FlexCAN0_1_IRQn ) ;
IntCtrl_Ip_InstallHandler ( FlexCAN0_1_IRQn , CAN0_ORED_0_31_MB_IRQHandler , NULL_PTR ) ;
FlexCAN_Ip_Init ( INST_FLEXCAN_0 , & FlexCAN_State0 , & FlexCAN_Config0 ) ;
FlexCAN_Ip_SetRxMaskType_Privileged ( INST_FLEXCAN_0 , FLEXCAN_RX_MASK_INDIVIDUAL ) ;
FlexCAN_Ip_SetRxIndividualMask_Privileged ( INST_FLEXCAN_0 , RX_MB_IDX , 0x0 << 18 ) ; // マスクレジスタをクリアして、すべての標準IDを受信できるようにします
FlexCAN_Ip_SetStartMode ( INST_FLEXCAN_0 ) ;
setupCanXCVR_TJA1153 () ;
tx_info.is_polling = FALSE ;
tx_info.msg_id_type = FLEXCAN_MSG_ID_STD ;
tx_info.data_length = 8 ;
tx_info.fd_enable = false ;
tx_info.enable_brs = false ;
FlexCAN_Ip_ConfigRxMb ( INST_FLEXCAN_0 , RX_MB_IDX , & rx_info , MSG_ID ) ;
FlexCAN_Ip_Receive ( INST_FLEXCAN_0 , RX_MB_IDX , & rxData , false ) ;
FlexCAN_Ip_Send ( INST_FLEXCAN_0 , TX_MB_IDX , & tx_info , MSG_ID , ( uint8 * ) & dummyData ) ;
( 1 )
{
g_canErrorStatus = FlexCAN_Ip_GetErrorStatus ( INST_FLEXCAN_0 ) ;
}
0を返す;
}
/* メイン処理終了 */
/*!
** @}
*/
こんにちは、@ Yash2530
添付ファイルには、RTDバージョン3.0.0で実施したテスト結果が含まれています。P07を参照してください。
こんにちは 、Senlentさん。
Canの送信は動作しており、NXPからWaveshareのUSB CANデバイスへのデータ受信は可能ですが、RXは動作していないようです。
IDとして0x001、データとして01 01 01 01 01 01 01 01を送信します。
何か見落としている点があるのでしょうか、それとも提供されたコードはTX専用なのでしょうか。