当Windows识别并进行USB枚举后,为了得到上述格式的单字节响应,操作系统开始向终端3IN发送周期性IN请求。该部件监控旋转控制的变化情况,并且当有动作(如音量增加)请求时发送通信数据;没有动作请求时,该固件返回0值。
MAX3420E简化了USB修改过程,SPI主控器(即ATtiny13)将报告数据字节写入EP3INFIFO(endpoint 3 IN FIFO)的寄存器。然后SPI主控器将数值1写入EP3INBC(endpoint3IN byte count)寄存器,表示为了响应USB的下一个IN请求,将会传送1个字节。传送发生后,MAX3420E产生中断请求,表明下一个字节的数据可以写入EP3INFIFO了。
下面是完整的传送程序。可以将音量控制器的HID信息传送给PC机。看似非常简单,但是该编码却包含了很多的HID控制页面。剩余的代码实现代码循环。该循环会检测旋转控制器,然后点亮发光二极管。对任意USB外围器件来说,USB样板文件代码需要进行内部处理。这个样板文件代码控制着器件的枚举、悬挂、恢复以及USB总线置零等命令。
Send_byte:
idi MAX_Reg,rEP3INFIFO
mov MAX_Dat,audio_flags
clr audio_flags
rcall wreg
idi MAX_Reg, rEP3INBC
mov MAX_Dat,1
rjmp wreg
4 读取旋转控制
旋转编码器用格雷编码端子A和B分别表示顺时针和逆时针旋转。旋转控制器与MAX3420E上有内置上拉电阻的GPIN引脚相连。图2显示的是左旋和右旋时的开关转接状态。锁定位置状态1和3是控制停止位置。控制器经过1个或3个状态后,可到下一个锁定位置。该固件只需对旋钮旋转进行译码,就可以实现向锁定状态1和3的转换。例如,实现右旋状态转换需要由3到1或由2到3。