マイクロコントローラーUSB学習(4)

でたらめ

多くの苦労の末、ついにUSBボードをはんだ付けしました。えーと、欠点について話しましょう。

  • 設計時に、電源に電源ライトを追加するのを忘れたため、電源がオンになったときに通知する電源インジケーターがありませんでした。そのため、LEDを使用する場合は、特にユーザーLEDライトを電源ライトとして使用して、電気があり、稼働していることを知らせます。
  • デバッグインターフェイスとしての発信シリアルポートはありません。この問題は実際には深刻ではありません。主な理由はUSBプロトコルを学習することであるため、USB CDCをシリアルポート(つまり、仮想シリアルポート)として使用できます。
  • ボードには位置決め穴がないので、固定したり支えたりすることはできません。テーブルに直接投げるのは少し危険なようです。

上記の点の欠陥に基づいて、ボードの次のバージョンは、優れた便利なUSB学習ボードになるように修正されます。

やってみませんか?

このボードには、USB1とUSB2の2つのUSBインターフェイスがあります。USB1はPIDUSBD12チップによって制御され、USB2はSTM32のUSBインターフェイスに直接接続されています。USB2に接続すると、コンピューターはデバイスを認識できないというプロンプトを表示します。これは正常です。USBデバイスをまったく駆動せず、ホストに指示を送信しなかったため、ホストはデバイスが接続されていることしか認識できません。にありますが、どのデバイスかわかりません。デバイスに関する情報がないため、認識されないデバイスとして認識されます。

ドライブPDIUSBD12

ここに画像の説明を挿入
図からわかるように、PDIUSBD12はデータ伝送用のデータワイヤとして8本のワイヤを使用します。2本のUSBワイヤがUSBインターフェイスに接続されています。6MHzの水晶振動子が装備されています。2本の読み取り/書き込み制御ピンと1本の割り込み生成があります。ピン。したがって、プログラムの観点から、それを運転することは実際には非常に簡単です。
残りの初期化(LED \ KEY、それについては説明しません。インターネット上にたくさんあります)では、STM32CUBEMXを直接使用して、LED \ KEY \ USBFSを含むプロジェクトの初期化を直接ビルドします。 、すべてが初期化されます。USBCDCは、シリアルポートのデバッグに使用するために初期化されます。
ここに画像の説明を挿入
完了後、PDIUSBD12を初期化し、最初にすべてのピンをプッシュ出力モードに初期化し、INTピンで割り込みを有効にする必要があります。

void PDIUSBD12_init(void)
{
    
    
	GPIO_InitTypeDef GPIO_Init;
	
	__HAL_RCC_GPIOB_CLK_ENABLE();
	__HAL_RCC_GPIOC_CLK_ENABLE();
	
	GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1|
					GPIO_PIN_2|GPIO_PIN_3|
					GPIO_PIN_4|GPIO_PIN_5|
					GPIO_PIN_6|GPIO_PIN_7;
	GPIO_Init.Pull = GPIO_NOPULL;
	GPIO_Init.Speed = GPIO_SPEED_FREQ_LOW
	HAL_GPIO_Init(GPIOC,&GPIO_Init);
	
	GPIO_Init.Pin = GPIO_PIN_12|GPIO_PIN_13;
	HAL_GPIO_Init(GPIOB,&GPIO_Init);
	
	
	GPIO_Init.Mode = GPIO_MODE_INPUT;
	GPIO_Init.Pin = GPIO_PIN_14;
	GPIO_Init.Pull = GPIO_NOPULL;
	HAL_GPIO_Init(GPIOB, &GPIO_Init);
}

初期化後、関連する読み取りおよび書き込み関数をデータポートに書き込む必要があります

void PDIUSBD12_write_cmd(uint8_t cmd)
{
    
    
	GPIO_InitTypeDef GPIO_Init;
	
	GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1|
					GPIO_PIN_2|GPIO_PIN_3|
					GPIO_PIN_4|GPIO_PIN_5|
					GPIO_PIN_6|GPIO_PIN_7;
	GPIO_Init.Pull = GPIO_NOPULL;
	GPIO_Init.Speed = GPIO_SPEED_FREQ_LOW; 
	HAL_GPIO_Init(GPIOC,&GPIO_Init);  
	
	HAL_GPIO_WritePin(USB_PDI_A0_PORT, USB_PDI_A0_PIN, GPIO_PIN_SET);   //A0拉高
	HAL_GPIO_WritePin(USB_PDI_WR_PORT, USB_PDI_WR_PIN, GPIO_PIN_RESET);   //WR拉低
	
	/* 一位位发送数据 */
	if(cmd & 0x80)	HAL_GPIO_WritePin(USB_PDI_D7_PORT, USB_PDI_D7_PIN, GPIO_PIN_SET);
	else HAL_GPIO_WritePin(USB_PDI_D7_PORT, USB_PDI_D7_PIN, GPIO_PIN_RESET);
	cmd <<= 1;
	
	if(cmd & 0x80)	HAL_GPIO_WritePin(USB_PDI_D6_PORT, USB_PDI_D6_PIN, GPIO_PIN_SET);
	else HAL_GPIO_WritePin(USB_PDI_D6_PORT, USB_PDI_D6_PIN, GPIO_PIN_RESET);
	cmd <<= 1;
	
	if(cmd & 0x80)	HAL_GPIO_WritePin(USB_PDI_D5_PORT, USB_PDI_D5_PIN, GPIO_PIN_SET);
	else HAL_GPIO_WritePin(USB_PDI_D5_PORT, USB_PDI_D5_PIN, GPIO_PIN_RESET);
	cmd <<= 1;
	
	if(cmd & 0x80)	HAL_GPIO_WritePin(USB_PDI_D4_PORT, USB_PDI_D4_PIN, GPIO_PIN_SET);
	else HAL_GPIO_WritePin(USB_PDI_D4_PORT, USB_PDI_D4_PIN, GPIO_PIN_RESET);
	cmd <<= 1;
	
	if(cmd & 0x80)	HAL_GPIO_WritePin(USB_PDI_D3_PORT, USB_PDI_D3_PIN, GPIO_PIN_SET);
	else HAL_GPIO_WritePin(USB_PDI_D3_PORT, USB_PDI_D3_PIN, GPIO_PIN_RESET);
	cmd <<= 1;
	
	if(cmd & 0x80)	HAL_GPIO_WritePin(USB_PDI_D2_PORT, USB_PDI_D2_PIN, GPIO_PIN_SET);
	else HAL_GPIO_WritePin(USB_PDI_D2_PORT, USB_PDI_D2_PIN, GPIO_PIN_RESET);
	cmd <<= 1;
	
	if(cmd & 0x80)	HAL_GPIO_WritePin(USB_PDI_D1_PORT, USB_PDI_D1_PIN, GPIO_PIN_SET);
	else HAL_GPIO_WritePin(USB_PDI_D1_PORT, USB_PDI_D1_PIN, GPIO_PIN_RESET);
	cmd <<= 1;
	
	if(cmd & 0x80)	HAL_GPIO_WritePin(USB_PDI_D0_PORT, USB_PDI_D0_PIN, GPIO_PIN_SET);
	else HAL_GPIO_WritePin(USB_PDI_D0_PORT, USB_PDI_D0_PIN, GPIO_PIN_RESET);
	cmd <<= 1;
	
	HAL_GPIO_WritePin(USB_PDI_WR_PORT, USB_PDI_WR_PIN, GPIO_PIN_SET);   //WR拉高
}

おすすめ

転載: blog.csdn.net/qq_42312125/article/details/105558672