MC33771B の BCC ドライバライブラリを使用して、カスタムボードで完全に動作します。しかし、IC を MC33771C に交換し、C バリアント用の公式 NXP BCC ドライバに切り替えると、 組み込みソフトウェアMC33771C パッケージ) 通信が失敗すると、 BCC_AssignCid CRCエラーが原因です。TPL通信が機能していないのは、常にエコーフレームしか受信できず、データを受信できないためです。同じハードウェアはmc33771bでは動作しますが、ICに合わせてbccライブラリを変更するだけです。
これは当社独自の基板回路図で、こちらはTPL通信用のコードです。
特定の実装とBCCライブラリを使用することで、MC33771Bとの通信は正常に動作します。コマンドの送信と有効な応答フレームの受信は正常に行えました。
しかし、同じ通信コードを使用し、MC33771C用のBCCライブラリ/設定のみを置き換えた場合、エコーフレームのみを受信し、デバイスからの有効な応答は得られません。
SPI/TPLのタイミング、フレームフォーマット、およびハードウェア接続は変更ありません。ウェイクアップシーケンスとINITシーケンスも実装されています。
MC33771Cでこの問題が発生した方はいますか?
bcc_status_t BCC_MCU_TransferTpl ( uint8_t drvInstance ,
uint8_t transBuf [] 、
uint8_t recvBuf [] 、
uint16_t recvTrCnt )
{
// 受信データの合計サイズ = 6バイト × 転送回数
uint16_t recvSize ;
if ( recvTrCnt > 0 )
recvSize = ( recvTrCnt -1 ) * 6 U ;
そうでない場合、
recvSize = 6 U ;
HAL_SPI_DeInit ( & hspi2 ) ;
HAL_Delay ( 2 ) ;
HAL_SPI_Init ( & hspi2 ) ;
memset ( recvBuf , 0 , sizeof ( & recvBuf )) ;
// SPI通信を開始する
HAL_GPIO_WritePin ( CS_TX_GPIO_Port , CS_TX_Pin , GPIO_PIN_RESET ) ;
HAL_SPI_Receive_IT ( & hspi2 , recvBuf , 6 ) ;
rxflag = 0 ;
// --- 48ビットフレームを1つ送信する ---
if ( HAL_SPI_Transmit_IT ( & hspi1 , transBuf , 6 ) != HAL_OK )
{
HAL_GPIO_WritePin ( CS_TX_GPIO_Port , CS_TX_Pin , GPIO_PIN_SET ) ;
return BCC_STATUS_PARAM_RANGE ;
}
BCC_MCU_WaitUs ( 5 ) ;
if ( spi2_rx_done == 1 )
{
HAL_SPI_Receive_IT ( & hspi2 , recvBuf , recvSize ) ;
spi2_rx_done = 0 ;
}
HAL_GPIO_WritePin ( CS_TX_GPIO_Port , CS_TX_Pin , GPIO_PIN_SET ) ;
return BCC_STATUS_SUCCESS ;
}
int MC33771_Init ( void )
{
// まずMC33664 TPLトランシーバを有効にします
HAL_GPIO_WritePin ( EN_GPIO_Port , EN_Pin , GPIO_PIN_RESET ) ;
HAL_Delay ( 1 ) ;
HAL_GPIO_WritePin ( EN_GPIO_Port , EN_Pin , GPIO_PIN_SET ) ;
HAL_Delay ( 10 ) ; // MC33664の準備が整うまで待機
// BCCドライバの設定
g_bccConfig.drvInstance = 0 ;
g_bccConfig.commMode = BCC_MODE_TPL ;
g_bccConfig.devicesCnt = 1 ;
g_bccConfig.device [ 0 ]= BCC_DEVICE_MC33771C ;
g_bccConfig.cellCnt [ 0 ]= 14 ;
// BCCライブラリを初期化する
status = BCC_Init ( & g_bccConfig ) ;
if ( status != BCC_STATUS_SUCCESS ) {
return ( int ) status ;
}
}
int MC33771_ReadAllCellVoltages ( float cellVoltages [ 14 ])
{
uint16_t測定値[ BCC_MEAS_CNT ] ;
uint32_t voltage_uv ;
uint8_tセル;
if ( cellVoltages == NULL ) {
-1を返す;
}
status = BCC_Meas_StartConversion ( & g_bccConfig , BCC_CID_DEV1 , BCC_AVG_1 ) ;
if ( status != BCC_STATUS_SUCCESS ) {
ステータスを返します。
}
HAL_Delay ( 600 ) ;
// 測定値を読み取る
status = BCC_Meas_GetRawValues ( & g_bccConfig , BCC_CID_DEV1 , measurements ) ;
if ( status != BCC_STATUS_SUCCESS ) {
ステータスを返します。
}
// すべてのセル電圧を抽出します
for ( cell = 0 ; cell < 14 ; cell ++ ) {
voltage_uv = BCC_GET_VOLT ( measurements [ BCC_MSR_STACK_VOLT + cell ]) ;
cellVoltages [ 13 - cell ] = ( float ) voltage_uv / 1000.0 f ;
cellVoltages [ 13 - cell ] = ( float ) cellVoltages [ 13 - cell ] / 1000.0 f ;
}
0を返す;
}
int main ( void )
{
/* すべてのペリフェラルをリセットし、フラッシュインターフェースとSystickを初期化します。*/
HAL_Init () ;
/* システムクロックを設定します */
SystemClock_Config () ;
/* ペリフェラルの共通クロックを設定します */
PeriphCommonClock_Config () ;
/* 設定済みのペリフェラルをすべて初期化します */
MX_GPIO_Init () ;
MX_DMA_Init () ;
MX_SPI1_Init () ;
MX_SPI2_Init () ;
MX_TIM16_Init () ;
MX_USART1_UART_Init () ;
MC33771_Init () ;
( 1 )
{
temp = MC33771_ReadAllCellVoltages ( voltage ) ;
HAL_Delay ( 1000 ) ;
}
}
void HAL_SPI_RxCpltCallback ( SPI_HandleTypeDef * hspi )
{
if ( hspi- > Instance == SPI2 )
spi2_rx_done = 1 ;
}
static void MX_SPI1_Init ( void )
{
/* USER CODE BEGIN SPI1_ Init 0 */
/* USER CODE END SPI1_ Init 0 */
/* USER CODE BEGIN SPI1_ Init 1 */
/* USER CODE END SPI1_ Init 1 */
/* SPI1 パラメータ設定 */
hspi1.Instance = SPI1 ;
hspi1.Init.Mode = SPI_MODE_MASTER ;
hspi1.Init.Direction = SPI_DIRECTION_2LINES ;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT ;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW ;
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE ;
hspi1.Init.NSS = SPI_NSS_SOFT ;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8 ;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB ;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE ;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE ;
hspi1.Init.CRCPolynomial = 7 ;
hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE ;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE ;
if ( HAL_SPI_Init ( & hspi1 ) != HAL_OK )
{
エラーハンドラー() ;
}
/* USER CODE BEGIN SPI1_ Init 2 */
/* USER CODE END SPI1_ Init 2 */
}
/**
* @brief SPI2 初期化関数
* @Paramなし
* @ retvalなし
*/
static void MX_SPI2_Init ( void )
{
/* USER CODE BEGIN SPI2_ Init 0 */
/* USER CODE END SPI2_ Init 0 */
/* USER CODE BEGIN SPI2_ Init 1 */
/* USER CODE END SPI2_ Init 1 */
/* SPI2 パラメータ設定 */
hspi2.Instance = SPI2 ;
hspi2.Init.Mode = SPI_MODE_SLAVE ;
hspi2.Init.Direction = SPI_DIRECTION_2LINES_RXONLY ;
hspi2.Init.DataSize = SPI_DATASIZE_8BIT ;
hspi2.Init.CLKPolarity = SPI_POLARITY_LOW ;
hspi2.Init.CLKPhase = SPI_PHASE_2EDGE ;
hspi2.Init.NSS = SPI_NSS_HARD_INPUT ;
hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB ;
hspi2.Init.TIMode = SPI_TIMODE_DISABLE ;
hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE ;
hspi2.Init.CRCPolynomial = 7 ;
hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE ;
hspi2.Init.NSSPMode = SPI_NSS_PULSE_DISABLE ;
if ( HAL_SPI_Init ( & hspi2 ) != HAL_OK )
{
エラーハンドラー() ;
}
/* USER CODE BEGIN SPI2_ Init 2 */
/* USER CODE END SPI2_ Init 2 */
}
ミラル様、
MC33771Cに推奨されているソフトウェアを使用している場合、ハードウェアの問題である可能性が高いです。AN12633を参照してください。MC33771BからMC33771Cに切り替える場合は、いくつかの外部部品を変更する必要があります。
例えば、ローパスフィルタのCLPFとCINは異なります。MC33664と最初のMC33771Bおよび/またはMC33771Cノード間の外部コンポーネントについては、それぞれMC33771BのフルデータシートおよびMC33771Cのフルデータシートのセクション13.2.6を参照してください。MC33771Cの完全なデータシートは一般公開されていますが、 MC33771Bの完全なデータシートは機密情報であり、有効なNDA(秘密保持契約)を締結すれば、セキュアセクションからダウンロードできます。
敬具、
ヨゼフ