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

📄 main.c

📁 AT91RM9200的USB相关ACM CDC的源代码包! AT91RM9200-BasicUSBPipe-ARM1_2-2_0.zip
💻 C
字号:
//*----------------------------------------------------------------------------
//*         ATMEL Microcontroller Software Support  -  ROUSSET  -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name           : main.c
//* Object              : main application written in C
//* Creation            : ODi   06/26/2002
//*
//*----------------------------------------------------------------------------
#include <stdio.h>
#include "main.h"
#include "lib_arm920t.h"

AT91S_SVC_USBCTL   usbEp0;
AT91S_SVC_USBOUT   usbEp1;
AT91S_SVC_USBIN    usbEp2;

#define TX_BUFFER_SIZE 40
char TX_BUFFER_DRV[TX_BUFFER_SIZE];
#define RX_BUFFER_SIZE 2
char RX_BUFFER_DRV[RX_BUFFER_SIZE];

//*----------------------------------------------------------------------------
//* \fn    AT91F_EnableICache
//* \brief Enable I Cache
//*----------------------------------------------------------------------------
void AT91F_EnableICache()
{
	unsigned int ctl;

	ctl = AT91F_ARM_ReadControl();
	ctl |= (1 << 12);
	AT91F_ARM_WriteControl(ctl);
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_InitDrivers
//* \brief This function initialize USART 1, the AIC and AT91S_SVC_USDRIVER driver
//*----------------------------------------------------------------------------
void AT91F_InitDrivers()
{
	// ============================= Init USB driver =============================
	AT91F_DBGU_Printk("-I- Init USB driver\n\r");
	// Configure PMC
	AT91F_UDP_CfgPMC();                        // Enable UDP peripheral
	AT91C_BASE_PMC->PMC_SCER |= AT91C_PMC_UDP; // Enable 48 MHz
	// Open DMA service for each endpoint
	AT91F_SVC_USBCTL_Open(&usbEp0, AT91C_BASE_UDP);
	usbEp0.DisptachSetup = AT91F_USB_DispatchRequest;
	AT91F_SVC_USBOUT_Open(&usbEp1, AT91C_BASE_UDP, 1, 64, 2);
	AT91F_SVC_USBIN_Open(&usbEp2, AT91C_BASE_UDP, 2, 64, 2);

	// Configure AIC controller to handle USB interrupts
	AT91F_AIC_ConfigureIt (
		AT91C_BASE_AIC,                        // AIC base address
		AT91C_ID_UDP,                          // System peripheral ID
		AT91C_AIC_PRIOR_HIGHEST,               // Max priority
		AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, // Level sensitive
		AT91F_ASM_UDP_Handler );

	// Enable Udp interrupt in AIC
	AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_UDP);
	
	// Enable UDP pullUp (PIOA10 on AT91RM3400DK)
	AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, AT91C_PIO_PA10);
	AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, AT91C_PIO_PA10);
	
}

#define BUFFER_SIZE 1024
char pBuffer[BUFFER_SIZE];
volatile char flgUsbOpAchieved;

void usbReceiveCallBack(AT91PS_SVC_USBOUT pUsbOut)
{
	flgUsbOpAchieved = 1;
}

void usbSentCallBack(AT91PS_SVC_USBIN pUsbIn)
{
	flgUsbOpAchieved = 1;
}

extern volatile char currentConfiguration;

int main()
{
	unsigned int messageSize, messageId = 0;
	printf("-I- Enter in main() section\n\r");

	// Init USART 1 console driver
	AT91F_InitDrivers();

	AT91F_EnableICache();

	AT91F_PIO_CfgOutput(AT91C_BASE_PIOC, (1 << 15) | (1 << 14));
	while (currentConfiguration != 1) {
		//AT91F_PIO_SetOutput(AT91C_BASE_PIOC, (1 << 15));
		//AT91F_PIO_ClearOutput(AT91C_BASE_PIOC, (1 << 15));
	}
	
	// Main loop
	while (1) {
		flgUsbOpAchieved = 0;
		usbEp1.Read(&usbEp1, pBuffer, BUFFER_SIZE, usbReceiveCallBack);
		while(!flgUsbOpAchieved);
		messageSize = BUFFER_SIZE - usbEp1.bufferSize;
		printf("-I- (%d) Message received: %d\n\r", messageId, messageSize);
		
		flgUsbOpAchieved = 0;
		usbEp2.Write(&usbEp2, pBuffer, messageSize, usbSentCallBack);
		while(!flgUsbOpAchieved);
		printf("-I- (%d) Message sent: %d\n\r", messageId, messageSize);
		++messageId;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -