📄 d12op.c
字号:
#include "DataType.h"
#include "d12op.h"
#include "D12Def.h"
/************************************************************
** 函数名称: U16 readchipid(void)
** 功能描述: 读取芯片ID
** 输 入: 无
** 输 出: 芯片的ID号
************************************************************/
U16 readchipid(void)
{
U8 i;
U16 chipid;
outportc(0xFD); //发送读PDIUSBD12芯片ID号命令
i = inportd(); //读取ID号高字节
chipid = inportd(); //读取ID号低位字节
chipid = chipid + i * 256; //组成16位的PDIUSBD12芯片ID号
return chipid;
}
/************************************************************
** 函数名称: void bus_delay(void)
** 功能描述: 总线延时
** 输 入: 无
** 输 出: 无
************************************************************/
void bus_delay(void)
{
U8 i;
i = D12_NOP; //对总线进行操作
}
/************************************************************
** 函数名称: void outportc(U8 Data)
** 功能描述: 输出命令
** 输 入: U8 Data: 命令字节
** 输 出: 无
************************************************************/
void outportc(U8 Data)
{
bus_delay(); //总线延时
D12_COM = Data; //发送命令
}
/************************************************************
** 函数名称: void outportd(U8 Data)
** 功能描述: 输出数据
** 输 入: U8 Data: 数据字节
** 输 出: 无
*************************************************************/
void outportd(U8 Data)
{
bus_delay(); //总线延时
D12_DAT = Data; //发送数据
}
/************************************************************
** 函数名称: U8 inportd(void)
** 功能描述: 读入数据
** 输 入: 无
** 输 出: 读到的数据
*************************************************************/
U8 inportd(void)
{
bus_delay(); //总线延时
return D12_DAT; //读取数据
}
/************************************************************
** 函数名称: void D12_SetAddressEnable(U8 bAddress,U8 bEnable)
** 功能描述: 设置地址/使能
** 输 入: U8 bAddress: 地址
U8 bEnable : 0 --- 禁止
1 --- 使能
** 输 出: 无
************************************************************/
void D12_SetAddressEnable(U8 bAddress, U8 bEnable)
{
outportc(0xD0); //输出设置地址/使能指令
if(bEnable)
bAddress |= 0x80; //bit7置1,使能
outportd(bAddress); //输出设置值
}
/************************************************************
** 函数名称: void D12_SetEndpointEnable(U8 bEnable)
** 功能描述: 设置端点使能
** 输 入: U8 bEnable : 0 --- 禁止
1 --- 允许
** 输 出: 无
**说明:通过设置设置地址/使能命令后才可使能普通/同步端点
************************************************************/
void D12_SetEndpointEnable(U8 bEnable)
{
outportc(0xD8); //输出设置端点使能指令
if(bEnable)
outportd(0x01); //设置端点允许
else
outportd(0x00); //设置端点禁止
}
/************************************************************
** 函数名称: void D12_SetMode(U8 bConfig,U8 bClkDiv)
** 功能描述: 模式设置
** 输 入:
** U8 bConfig : 配置字节信息
bit0: 保留
bit1: LazyClock,1表示CLKOUT不会切换到LazyClock;
0表示CLKOUT在Suspend脚变高之后切换到LazyClock;
LazyClock频率是30KHz±40%;
编程值将不过会被总线复位所改变
bit2: 时钟运行,1表示内部时钟和PLL即使在挂起状态下仍然运行;
0表示只要不需要时内部时钟晶振和PLL就停止运行;
为了满足严格的挂起电流要求该位需要设置为0;
已编程的值不会被总线复位所改变
bit3: 中断模式,1表示报告所有的错误和NAKing并产生一个中断;
0表示只有OK被报告;
编程值不会被总线复位所改变
bit4: SoftConnect,1表示如果VBUS可用上行数据上拉电阻就被连接;
0表示不连接;
已编程的值不会被总线复位所改变
bit5: 保留
bit6-7: 端点配置,该两位设置端点配置如下
模式0 非同步模式
模式1 同步输出模式
模式2 同步输入模式
模式3 同步输入/输出模式
U8 bClkDiv: 分频系数
bit0-3:时钟分频系数,该值用来表示CLKOUT的时钟分频系数;
用N表示分频系数那么输出频率就为48MHz/(N+1),复位值为11,这产生4MHz的输出频率;
可由用户自行调节,当N为0时得到最大频率48MHz,当N取最大11时得到最小频率4MHz;
PDIUSBD12的设计确保了在改变频率时不会出现干扰已编程的值不会被总线复位所改变
bit4-5:保留
bit6:SET_TO_ONE,该位需要在任何DMA读或写操作之前置为1,该位在上电复位值为0,复位后可将其一直设为1
bit7:仅有SOF 中断模式,将该位置1后仅当帧时钟的起始SOF时刻引起中断的产生而不管引脚中断模式的(设置状态设置DMA位5)
** 输 出: 无
************************************************************/
void D12_SetMode(U8 bConfig,U8 bClkDiv)
{
outportc(0xF3); //输出设置模式指令
outportd(bConfig); //输出配置字节信息
outportd(bClkDiv); //输出时钟分频因数字节
}
/************************************************************
** 函数名称: void D12_SetDMA(U8 bMode)
** 功能描述: 设置DMA工作方式设置
** 输 入: U8 bMode: 设置值
** 输 出: 无
************************************************************/
void D12_SetDMA(U8 bMode)
{
outportc(0xFB); //设置DMA工作方命令
outportd(bMode); //输出设置值
}
/************************************************************
** 函数名称: U16 D12_ReadInterruptRegister(void)
** 功能描述: 读取中断寄存器值
** 输 入: 无
** 输 出: 中断寄存器值
************************************************************/
U16 D12_ReadInterruptRegister(void)
{
U8 b1;
U16 j;
outportc(0xF4); //读取中断寄存器命令
b1 = inportd(); //读取低8位字节
j = inportd(); //读取高8位字节
j = j * 256;
j += b1; //组合为16位
return j;
}
/************************************************************
** 函数名称: U8 D12_SelectEndpoint(U8 bEndp)
** 功能描述: 端点选择,将内部指针初始化到选择的缓冲区起始位置
** 输 入: U8 bEndp: 端点索引号,取值0 ~ 5
** 输 出: 读出的字节
bit0: 满/空,1表示缓冲区已满;0表示缓冲区为空
bit1: 停止,1表示选择的端点处于停止状态
************************************************************/
U8 D12_SelectEndpoint(U8 bEndp)
{
U8 c;
outportc(bEndp); //端点选择
c = inportd(); //读出一个字节
return c;
}
/************************************************************
** 函数名称: U8 D12_ReadEndpointStatus(U8 bEndp)
** 功能描述: 读取端点状态
** 输 入: U8 bEndp: 端点索引号,取值0 ~ 5
** 输 出: 端点状态
************************************************************/
U8 D12_ReadEndpointStatus(U8 bEndp)
{
U8 c;
outportc(0x80 + bEndp); //读取端点状态命令
c = inportd(); //读取端点状态
return c;
}
/************************************************************
** 函数名称: U8 D12_ReadLastTransactionStatus(U8 bEndp)
** 功能描述: 读取最后处理状态寄存器
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -