⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 d12ci.c

📁 msp430单片机与pdiusbd12接口的固件程序
💻 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 + -