微控制器USB学习(四)

USB实践

  • 废话在前面
  • 来试试?
  • 驱动PDIUSBD12

废话在前面

经历千辛万苦终于把USB的板子焊好了,emm,来说一下缺点。

  • 在设计的时候,忘了给电源加上电源灯,这导致上电的时候的,并没有电源指示灯告诉我上电了。因此我在LED的使用上,特地用一个用户LED灯当作电源灯,告诉我自己有电并且在运行。
  • 没有流出串口接口作为调试接口,这个问题其实并不严重,主要是学习USB的协议,所以我可以利用USB CDC当作串口来使用(就是虚拟串口)。
  • 板子上没有加入定位孔定位,所以我不能用东西固定或者撑起来,直接扔桌面显得有些不安全。

根据以上几点的缺陷,在下一个版本的板子上将会进行修正,做一个好的、方便的USB学习板卡。

来试试?

此板卡上有两个USB接口,USB1 和USB2,USB1使用的是PIDUSBD12的芯片控制的,USB2直接接STM32的USB接口。在接入USB2的时候,电脑将提示无法识别设备,这很正常的,因为我根本没有驱动起USB设备,没有给主机发送指令,所以主机只能识别到有设备插入,却不知道这个设备是什么设备,没有任何信息,所以识别为无法识别的设备。

驱动PDIUSBD12

微控制器USB学习(四)_第1张图片
由图可以看到,PDIUSBD12使用8根线作为数据线传输数据用,两根USB线接入USB接口,配有6MHz的晶振,有两个读写控制引脚和一个中断发生引脚。所以,在程序上,其实很好对其进行驱动。
其余部分的初始化(LED\KEY那些,我就不说了,网上大把),我直接用STM32CUBEMX直接建立好工程的初始化,包括LED\KEY\USB FS,都初始化好,USB CDC的初始化是为了用作串口调试用。
微控制器USB学习(四)_第2张图片
完成之后,对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拉高
}

你可能感兴趣的:(USB)