经历千辛万苦终于把USB的板子焊好了,emm,来说一下缺点。
根据以上几点的缺陷,在下一个版本的板子上将会进行修正,做一个好的、方便的USB学习板卡。
此板卡上有两个USB接口,USB1 和USB2,USB1使用的是PIDUSBD12的芯片控制的,USB2直接接STM32的USB接口。在接入USB2的时候,电脑将提示无法识别设备,这很正常的,因为我根本没有驱动起USB设备,没有给主机发送指令,所以主机只能识别到有设备插入,却不知道这个设备是什么设备,没有任何信息,所以识别为无法识别的设备。
由图可以看到,PDIUSBD12使用8根线作为数据线传输数据用,两根USB线接入USB接口,配有6MHz的晶振,有两个读写控制引脚和一个中断发生引脚。所以,在程序上,其实很好对其进行驱动。
其余部分的初始化(LED\KEY那些,我就不说了,网上大把),我直接用STM32CUBEMX直接建立好工程的初始化,包括LED\KEY\USB FS,都初始化好,USB CDC的初始化是为了用作串口调试用。
完成之后,对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拉高
}