USBの練習
でたらめ
多くの苦労の末、ついに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拉高
}