📄 d12ci.c
字号:
/*************************************************************************
描述: PDIUSBD12 firware for MSP430F149
文件名: mainloop.h
修改: Miracle G. Eicont.
日期: 2006-06-08
*************************************************************************/
#include <msp430x14x.h> /* special function register declarations */
#include "mainloop.h"
#include "d12ci.h"
#include "epphal.h"
extern EPPFLAGS bEPPflags;
//设置地址使能
void D12_SetAddressEnable(unsigned char bAddress, unsigned char bEnable)
{
outportb(D12_COMMAND, 0xD0);//输出指令
if(bEnable)
bAddress |= 0x80;
outportb(D12_DATA, bAddress);//设置地址
}
//设置端点使能
void D12_SetEndpointEnable(unsigned char bEnable)
{
outportb(D12_COMMAND, 0xD8);//输出指令
if(bEnable)
outportb(D12_DATA, 1);//设置端点允许
else
outportb(D12_DATA, 0);//设置端点禁止
}
//模式设置
void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv)
{
outportb(D12_COMMAND, 0xF3);//设置模式
outportb(D12_DATA, bConfig);
outportb(D12_DATA, bClkDiv);
}
//DMA工作方式设置
void D12_SetDMA(unsigned char bMode)
{
outportb(D12_COMMAND, 0xFB);//设置DMA工作方式
outportb(D12_DATA, bMode);
}
//读取中断寄存器
unsigned short D12_ReadInterruptRegister(void)
{
unsigned char b1;
unsigned int j;
outportb(D12_COMMAND, 0xF4);//读取中断寄存器
b1 = inportb(D12_DATA);
j = inportb(D12_DATA);
j <<= 8;
j += b1;
return j;
}
//端点选择
unsigned char D12_SelectEndpoint(unsigned char bEndp)
{
unsigned char c;
outportb(D12_COMMAND, bEndp);//端点选择
c = inportb(D12_DATA);
return c;
}
//读取最后传输状态
unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp)
{
outportb(D12_COMMAND, 0x40 + bEndp);//返回最后传输状态
return inportb(D12_DATA);
}
//读取端点状态
unsigned char D12_ReadEndpointStatus(unsigned char bEndp)
{
unsigned char c;
outportb(D12_COMMAND, 0x80 + bEndp);//读取端点状态
c = inportb(D12_DATA);
return c;
}
//设置端点状态
void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled)
{
outportb(D12_COMMAND, 0x40 + bEndp);//设置端点状态
outportb(D12_DATA, bStalled);
}
//传输恢复
void D12_SendResume(void)
{
outportb(D12_COMMAND, 0xF6);//设置发送恢复
}
//读取当前帧号
unsigned short D12_ReadCurrentFrameNumber(void)
{
unsigned short i,j;
outportb(D12_COMMAND, 0xF5);//读取当前帧数目
i= inportb(D12_DATA);
j = inportb(D12_DATA);
i += (j<<8);
return i;
}
unsigned short D12_ReadChipID(void)
{
unsigned short i,j;
outportb(D12_COMMAND, 0xFD);
i=inportb(D12_DATA);
j=inportb(D12_DATA);
i += (j<<8);
return i;
}
//读取端点数据
unsigned char D12_ReadEndpoint(unsigned char endp, unsigned char len, unsigned char * buf)
{
unsigned char i, j;
outportb(D12_COMMAND, endp);
if((inportb(D12_DATA) & D12_FULLEMPTY) == 0) {
if(bEPPflags.bits.in_isr == 0)
ENABLE;
return 0;
}
outportb(D12_COMMAND, 0X80 | endp); //Get Endpoint Status
i = inportb(D12_DATA);
i &= 0X60;
if(endp == 2)
{
if(i == 0X60)
bEPPflags.bits.ep1buf_full = 1;
else
bEPPflags.bits.ep1buf_full = 0;
}
if(endp == 4)
{
if(i == 0X60)
bEPPflags.bits.ep2buf_full = 1;
else
bEPPflags.bits.ep2buf_full = 0;
}
outportb(D12_COMMAND, 0xF0);
j = inportb(D12_DATA);
j = inportb(D12_DATA);
if(j > len)
j = len;
for(i=0; i<j; i++)
*(buf+i) = inportb(D12_DATA);
outportb(D12_COMMAND, 0xF2);
return j;
}
//写端点
unsigned char D12_WriteEndpoint(unsigned char endp, unsigned char len, unsigned char * buf)
{
unsigned char i;
outportb(D12_COMMAND, endp); //选择端点
i = inportb(D12_DATA); //
outportb(D12_COMMAND, 0xF0); //写缓冲区
outportb(D12_DATA, 0); //
outportb(D12_DATA, len); //
for(i=0; i<len; i++)
outportb(D12_DATA, *(buf+i));//
outportb(D12_COMMAND, 0xFA); //使缓冲区有效
return len;
}
//设置端点应答
void D12_AcknowledgeEndpoint(unsigned char endp)
{
outportb(D12_COMMAND, endp);
outportb(D12_COMMAND, 0xF1); //发送应答
if(endp == 0)
outportb(D12_COMMAND, 0xF2); //清缓冲区,但为什么只清 endp==0
}
//输出数据
void outportb(unsigned int Addr, unsigned char Data)
{
MCU_D12CS_0;
if(Addr) A0_COMMAND;
else A0_DATA;
D12_dat_dir = 0XFF;
D12_dat_out = Data;
D12_WR_0;
_NOP();
D12_WR_1;
MCU_D12CS_1;
}
//输入数据
unsigned char inportb(unsigned int Addr)
{
unsigned char Data;
MCU_D12CS_0;
if(Addr) A0_COMMAND;
else A0_DATA;
D12_dat_dir = 0X00;
D12_RD_0;
_NOP();
Data = D12_dat_in;
D12_RD_1;
MCU_D12CS_1;
return Data;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -