46
配置步骤:
(1)、设置SPI时钟分频设置寄存器SPI0_CK_SE,配置SPI时钟频率。
(2)、设置SPI设置寄存器SPI0_SETUP的位bS0_MODE_SLV为0,配置为主机模式。
(3)、设置SPI控制寄存器SPI0_CTRL的位bS0_MST_CLK,根据需求设置为模式0或者3。
(4)、设置SPI控制寄存器SPI0_CTRL的位bS0_SCK_OE和bS0_MOSI_OE为1,bS0_MISO_OE位为0,
设置P1端口方向bSCK、bMOSI为输出,bMISO为输入,以及片选引脚为输出。 数据发送过程:
(1)、写SPI0_DATA寄存器,向FIFO写入要发送的数据,自动启动一次SPI传输。 (2)、等待S0_FREE为1,说明发送完成,可以继续发送下一字节。
数据接收过程:
(1)、写SPI0_DATA寄存器,向FIFO写入任意数据例如0FFh以启动一次SPI传输。 (2)、等待S0_FREE为1,说明接收完成,可以读取SPI0_DATA获得接收到的数据。
(3)、如果之前bS0_DATA_DIR已置1,则上述读操作也会启动下一次SPI传输,否则不启动。
14.4.2 SPI从机模式配置
从机模式下,SCK引脚用于接收连接的SPI主机的串行时钟。
(1)、设置SPI0设置寄存器SPI0_SETUP的位bS0_MODE_SLV为1,配置为从机模式。
(2)、设置SPI0控制寄存器SPI0_CTRL的位bS0_SCK_OE和bS0_MOSI_OE为0,设置bS0_MISO_OE为
1,设置P1端口方向bSCK、bMOSI和bMISO以及片选引脚都为输入。当SCS片选有效(低电平)时,MISO将自动使能输出。同时建议设置MISO引脚为高阻输入模式(P1_MOD_OC[6]=0、P1_DIR_PU[6]=0),使MISO在片选无效期间不输出,便于共享SPI总线。
(3)、可选的,设置SPI从机模式预置数据存器SPI0_S_PRE,用于被片选后首次自动加载到缓冲区
中用于对外输出。在8个串行时钟之后,即首个数据字节传输交换完毕,CH555得到外部SPI主机发来的首字节数据(可能是命令码),外部SPI主机交换得到SPI0_S_PRE中的预置数据(可能是状态值)。寄存器SPI0_S_PRE的位7将在SPI片选有效后的SCK低电平期间自动加载到MISO引脚上,对于SPI模式0,如果CH555预置了SPI0_S_PRE的位7,那么外部SPI主机将在SPI片选有效但尚未传输数据时,就能够通过查询MISO引脚得到SPI0_S_PRE的位7的预置值,从而通过仅仅有效一下SPI片选就能获得SPI0_S_PRE的位7的值。
数据发送过程:
查询S0_IF_BYTE或者等待中断,在每次SPI数据字节传输完成后,写SPI0_DATA寄存器,向FIFO写入要发送的数据。或者等待S0_FREE从0变为1,可以继续发送下一字节。
数据接收过程:
查询S0_IF_BYTE或者等待中断,在每次SPI数据字节传输完成后,读SPI0_DATA寄存器,从FIFO获得接收到的数据。查询S0_R_FIFO可以获知FIFO中是否有剩余字节。
15、模数转换器ADC
15.1 ADC和CMP简介
CH555芯片提供12位的模拟数字转换器,包括模数转换器ADC和电压比较器CMP模块。 该ADC具有14个外部模拟信号输入通道和2个内部输入通道(参考电压),可以分时采集,支持0到VDD模拟输入电压范围。
该CMP的正相输入端有两种输入选择:当bCMP_PIN=1时选择经电阻分压连接到上述ADC模拟输入通道;当bCMP_PIN=0时选择经电阻分压输入VDD电源。反相输入端由MASK_CMP_VREF选择参考电
47
压,该CMP一般主要用于电源电压监测和DC-DC控制,参考7.2节。
15.2 ADC寄存器
表15.2.1 ADC相关寄存器列表
名称 ADC_CTRL ADC_DAT_H ADC_DAT_L ADC_DAT ADC_CHAN
地址 F3h F5h F4h F4h F6h
ADC控制和状态寄存器 ADC结果数据的高字节(只读) ADC结果数据的低字节(只读)
ADC_DAT_L和ADC_DAT_H组成16位SFR ADC模拟信号通道选择寄存器
描述
复位值 xxh 0xh xxh 0xxxh 00h
ADC控制和状态寄存器(ADC_CTRL):
位 [7:6] 5 4 3 2 1 0
表15.2.2 ADC参考时钟频率选择表
bADC_CLK1 bADC_CLK0 ADC参考时钟频率 完成一次ADC所需时间
0 0 1 1
0 1 0 1
750KHz 1.5MHz 3MHz 6MHz
512个Fosc周期 256个Fosc周期 128个Fosc周期 64个Fosc周期
适用范围
Rs<=20KΩ或Cs>=0.08uF Rs<=10KΩ或Cs>=0.08uF VDD>=3V并且
(Rs<=5KΩ或Cs>=0.08uF) VDD>=4.5V并且
(Rs<=2KΩ或Cs>=0.08uF)
名称 保留 bADC_IF bADC_START bADC_EN 保留 bADC_CLK1 bADC_CLK0
访问 R0 RW RW RW R0 RW RW
保留
ADC转换完成中断标志,该位为1表示一次ADC转
换完成,写1清零或写ADC_CHAN数据时清零 ADC启动控制位,置1启动一次ADC转换,该位在ADC转换完成后自动清零
ADC模块的电源控制位,该位为0表示关闭ADC模块的电源,进入睡眠状态;该位为1表示开启 保留
ADC参考时钟频率选择高位 ADC参考时钟频率选择低位
描述
复位值 00b 0 0 0 0 0 0
注:VDD指电源电压,Cs指信号源并联电容值,Rs指信号源串联内阻值(采样时间仅4个参考时钟)
ADC模拟信号通道选择寄存器(ADC_CHAN):
位 [7:4] [3:0]
表15.2.1 电压比较器CMP正相输入端和ADC输入外部信号通道选择表
bADC_EN 0 1
ADC_CHAN xxxxb 0000b
选择模拟信号通道的信号源
断开内部和外部信号通道(AIN0~AIN13),悬空 连接到外部信号:AIN0(P1.0)
名称 保留 MASK_ADC_CHAN
访问 R0 RW
保留
当bADC_EN=1时选择模拟信号通道的信号源; 当bADC_EN=0时模拟信号通道关闭
描述
复位值 0000b 0000b
48
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0001b 0010b 0011b 0100b 0101b 0110b 0111b 1000b 1001b 1010b 1011b 1100b 1101b 1110b 1111b
连接到外部信号:AIN1(P1.1) 连接到外部信号:AIN2(P1.2) 连接到外部信号:AIN3(P1.3) 连接到外部信号:AIN4(P1.4) 连接到外部信号:AIN5(P1.5) 连接到外部信号:AIN6(P1.6) 连接到外部信号:AIN7(P1.7) 连接到外部信号:AIN8(P0.0) 连接到外部信号:AIN9(P0.1) 连接到外部信号:AIN10(P0.2) 连接到外部信号:AIN11(P0.3) 连接到外部信号:AIN12(P0.4) 连接到外部信号:AIN13(P0.5) 连接到内部参考电压:V33电压
连接到内部参考电压:1.8V电压VREF18(可能有噪声)
ADC数据寄存器(ADC_DAT):
位 [7:0] [7:0]
名称 ADC_DAT_H ADC_DAT_L
访问 RO RO
描述
ADC采样结果数据的高字节 ADC采样结果数据的低字节
复位值 0xh xxh
49
ADC_CHANAIN0AIN1AIN2AIN3~AIN12AIN13V33VREF18VDDbCMP_PIN0000--0001—1/16MUX1110--1111--bADC_STARTsampleRswCaGNDbADC_ENto_interruptbADC_CLK1/0clocksample----- D0~D11VIN ADC ADC_ENDADC_DATRMASK_CMP_VREFRMUXRIN+ CMPIN-RVREF_1.2VGNDbCMP_RESULT
图15.2.1 ADC结构图(蓝色线为模拟信号)
15.3 ADC功能
ADC采样模式配置步骤:
(1)、设置ADC_CTRL寄存器中的bADC_EN位为1,开启ADC模块,设置bADC_CLK0/1选择频率。 (2)、设置ADC_CHAN寄存器,选择外部或内部信号通道。
(3)、可选的,清零中断标志bADC_IF。可选的,如果使用中断模式,还需要在此使能中断。 (4)、设置ADC_CTRL寄存器中的bADC_START,启动一次ADC转换。 (5)、等待bADC_START变为0,或者bADC_IF被置1(如果之前已清零),表示ADC转换结束,可通
过ADC_DAT读取结果数据。该数据是输入电压相对于VDD电源电压的4095等份的值,例如,结果数据是475,说明输入电压接近VDD电压的475/4095。如果VDD电源电压也不确定,那么可以另测一个确定的参考电压值,再按比例计算出被测的输入电压值和VDD电源电压值。 (6)、如果再次设置bADC_START则可启动下一次ADC转换。
(7)、如果ADC参考时钟频率较高导致采样时间较短,或者信号源串联内阻值较大,或者电源电压较
低导致Rsw内阻较大,那么有可能Ca采样不到足够的信号电压,影响ADC结果。解决方法是丢弃第一次ADC数据,立即启动第二次ADC并用其ADC结果数据,相当于采样两次。 (7)、对精度要求较高时,建议使用前校准,用软件消除固有偏差。
上述被选择的外部模拟信号通道,其所在GPIO引脚必须设置为高阻输入模式、或者开漏输出模式并且处于输出1的状态(相当于高阻输入),Pn_DIR_PU[x]=0,并且关闭上拉电阻和下拉电阻。
50
16、USB控制器
16.1 简介
CH555集成了一个USB复合设备控制器,其中包括一个USB device-hub(USBHB)以同时支持3个HID功能子设备,分别是USBD0、USBD1、USBD2。
CH555的USB控制器的主要特性如下:
(1)、支持USB控制传输、批量传输、中断传输、同步/实时传输; (2)、支持最大64字节的数据包,内置FIFO,支持中断和DMA; (3)、支持USB 2.0全速12Mbps;
(4)、复合设备控制器包括一个内置集线器device-hub和三个各自独立的功能子设备; (5)、可选,关闭复合设备,仅启用USBD0设备。
16.2 功能
内置集线器USBHB提供了3个端点:端点0是默认端点,支持控制传输,发送和接收共用一个64字节数据缓冲区;端点1是发送端点IN,有一个独立的64字节数据缓冲区,支持批量传输、中断传输和实时/同步传输;端点4是可选的接收端点OUT,使用端点0的64字节数据缓冲区的后32字节,支持批量传输、中断传输和实时/同步传输。
0#功能子设备USBD0提供了7个端点:端点0是默认端点,支持控制传输,发送和接收共用一个64字节数据缓冲区;端点1、端点2、端点3可以各自独立配置为发送端点IN或接收端点OUT,各有一个独立的64字节数据缓冲区,支持批量传输、中断传输和实时/同步传输;端点4是可选的接收端点OUT,使用端点0的64字节数据缓冲区的后32字节,支持批量传输、中断传输和实时/同步传输;端点5、端点6是可选的各自独立的发送端点IN,分别使用端点1、端点2的64字节数据缓冲区的后32字节,支持批量传输、中断传输和实时/同步传输。
由于3个功能子设备的结构相同,所以下面仅以USBD0进行说明。
每个端点都具有一个控制寄存器D0_EPnRES和发送长度寄存器D0_EPnT_L,用于设定该端点的同步触发位、对OUT事务或IN事务的响应以及发送数据的长度等。
作为USB设备所必要的USB总线上拉电阻可以由软件随时设置是否启用,当USB_CTRL中的bUX_DP_PU_EN置1时,CH555在内部为DP引脚连接上拉电阻,并启用USB复合设备功能。
当USB连接计算机后,首先会进行device-hub枚举,接着根据该hub下行端口的连接状态对各个功能子设备依次进行枚举,最后计算机与各个功能子设备分时进行USB数据通讯。
当检测到USB总线复位、总线挂起或唤醒事件,或者当USB成功处理完数据发送或者数据接收后,USB协议处理器都将设置相应的中断标志并产生中断请求。应用程序可以直接查询或在USB中断服务程序中分析USB_IF、分析D0_STATUS或HB_STATUS,处理完数据传输中断事务后可以直接清除USB_IF中的相应中断标志。各个功能子设备只需要处理USB数据传输中断bUX_IF_D0_TRANS,USBHB需要处理USB数据传输中断bUX_IF_HB_TRANS和总线复位中断bUX_IF_BUS_RST、总线挂起或唤醒中断bUX_IF_SUSPEND、FIFO溢出中断bUX_IF_FIFO_OV等公共事务。
USB的所有数据缓冲区都是固定地址的,端点0的数据缓冲区起始地址的计算公式如下:
#define pDi_EP0_BUF(i) ((PUINT8X)(i*0x100+0x1000+UX_EP0_ADDR)) 其中i为子设备的序号0~3,此处3表示device-hub。
自端点0的64字节缓冲区(可选端点4占用后32字节)之后,依次每隔64字节是端点1(可选端点5占用后32字节)、端点2(可选端点6占用后32字节)、端点3的各自64字节缓冲区。
例如USBD1端点0的缓冲区起始地址是(1*0x100+0x1000+UX_EP0_ADDR)=0x1100;
USBD1端点5的缓冲区起始地址是0x1100+64+32=0x1160。
16.3 寄存器
表16.3.1 USB全局和USBHB相关寄存器列表