progressJanuary 2008
February 2008March 2008May 2008fileslinks |
user.c Source code
The following code is the custom code for translating the data from the Universal Serial Bus (USB) to SPI for MAX7219. It is derived from the Demo02 Code given by Microchip. Compiler : C18 MPLAB v8 user/user.c /** I N C L U D E S **********************************************************/ #include <p18cxxx.h> #include <usart.h> #include <delays.h> #include "system\typedefs.h" #include "system\usb\usb.h" #include "io_cfg.h" // I/O pin mapping #include "user\user.h" #include <spi.h> /** V A R I A B L E S ********************************************************/ #pragma udata byte counter; byte trf_state; DATA_PACKET dataPacket; /** P R I V A T E P R O T O T Y P E S ***************************************/ void BlinkUSBStatus(void); void ServiceRequests(void); void InitMAX7219(void); void SendRaw7219Packet(void); void OutSerialData(void); /** D E C L A R A T I O N S **************************************************/ #pragma code void UserInit(void) { mInitAllLEDs(); InitMAX7219(); }//end UserInit /****************************************************************************** * Function: void ProcessIO(void) * * PreCondition: None * * Input: None * * Output: None * * Side Effects: None * * Overview: This function is a place holder for other user routines. * It is a mixture of both USB and non-USB tasks. * * Note: None *****************************************************************************/ void ProcessIO(void) { BlinkUSBStatus(); // User Application USB tasks if((usb_device_state < CONFIGURED_STATE)||(UCONbits.SUSPND==1)) return; ServiceRequests(); }//end ProcessIO void ServiceRequests(void) { byte index; if(USBGenRead((byte*)&dataPacket,sizeof(dataPacket))) { counter = 0; switch(dataPacket.CMD) { case READ_VERSION: //dataPacket._byte[1] is len dataPacket._byte[2] = MINOR_VERSION; dataPacket._byte[3] = MAJOR_VERSION; counter=0x04; break; case RAW_MAX_PACKET://RAW_MAX_PACKET SendRaw7219Packet(); dataPacket._byte[2] = ~dataPacket._byte[2]; dataPacket._byte[3] = ~dataPacket._byte[3]; counter=0x06; break; case OUT_SERIAL_DATA: OutSerialData(); LOAD7219 = 1; dataPacket._byte[1]=0x02; dataPacket._byte[2]=dataPacket._byte[0]; counter=0x03; break; case PULSE_LOAD: LOAD7219 = 1; break; case RESET: Reset(); break; default: break; }//end switch() if(counter != 0) { if(!mUSBGenTxIsBusy()) USBGenWrite((byte*)&dataPacket,counter); }//end if }//end if }//end ServiceRequests /****************************************************************************** * Function: void InitMAX7219(void) * * PreCondition: None * * Input: None * * Output: None * * Side Effects: None * * Overview: Initializes the SPI port for MAX7219 * * * Note: * * *****************************************************************************/ void InitMAX7219(void) { TRISCbits.TRISC7 = 0; // Enabling SPI Pins Master mode TRISBbits.TRISB1 = 0; OpenSPI(SPI_FOSC_64, MODE_00, SMPEND); tris_LOAD7219 = OUTPUT_PIN; LOAD7219 = 0; }//end InitMAX7219 void SendRaw7219Packet() { LOAD7219 = 0; WriteSPI(dataPacket._byte[2]); WriteSPI(dataPacket._byte[3]); dataPacket._byte[4]=0x55; dataPacket._byte[5]=0xAA; LOAD7219 = 1; counter = 0xff; while(counter--); } void OutSerialData() { byte index; //dataPacket.data[DATA_SIZE-1] = 0; // Precaution null terminator LOAD7219 = 0; index = 0; counter = dataPacket.len; while(index<counter) { WriteSPI(dataPacket.data[index]); index++; } } /****************************************************************************** * Function: void BlinkUSBStatus(void) * * PreCondition: None * * Input: None * * Output: None * * Side Effects: None * * Overview: BlinkUSBStatus turns on and off LEDs corresponding to * the USB device state. * * Note: mLED macros can be found in io_cfg.h * usb_device_state is declared in usbmmap.c and is modified * in usbdrv.c, usbctrltrf.c, and usb9.c *****************************************************************************/ void BlinkUSBStatus(void) { static word led_count=0; if(led_count == 0)led_count = 10000U; led_count--; #define mLED_Both_Off() {mLED_1_Off();mLED_2_Off();} #define mLED_Both_On() {mLED_1_On();mLED_2_On();} #define mLED_Only_1_On() {mLED_1_On();mLED_2_Off();} #define mLED_Only_2_On() {mLED_1_Off();mLED_2_On();} if(UCONbits.SUSPND == 1) { if(led_count==0) { mLED_1_Toggle(); mLED_2 = mLED_1; // Both blink at the same time }//end if } else { if(usb_device_state == DETACHED_STATE) { mLED_Both_Off(); } else if(usb_device_state == ATTACHED_STATE) { mLED_Both_On(); } else if(usb_device_state == POWERED_STATE) { mLED_Only_1_On(); } else if(usb_device_state == DEFAULT_STATE) { mLED_Only_2_On(); } else if(usb_device_state == ADDRESS_STATE) { if(led_count == 0) { mLED_1_Toggle(); mLED_2_Off(); }//end if } else if(usb_device_state == CONFIGURED_STATE) { if(led_count==0) { mLED_1_Toggle(); mLED_2 = !mLED_1; // Alternate blink }//end if }//end if(...) }//end if(UCONbits.SUSPND...) }//end BlinkUSBStatus /** EOF user.c ***************************************************************/user/user.h #ifndef PICDEM_FS_DEMO_H #define PICDEM_FS_DEMO_H /** I N C L U D E S **********************************************************/ #include "system\typedefs.h" /** D E F I N I T I O N S ****************************************************/ /* MDB Version */ #define MINOR_VERSION 0x0B //Demo Version 1.10 #define MAJOR_VERSION 0x01 #define OVER_HEAD 2 //Overhead:io_cfg.h #ifndef IO_CFG_H #define IO_CFG_H /** I N C L U D E S *************************************************/ #include "autofiles\usbcfg.h" /** T R I S *********************************************************/ #define INPUT_PIN 1 #define OUTPUT_PIN 0 /** U S B ***********************************************************/ #define tris_usb_bus_sense TRISAbits.TRISA1 // Input #if defined(USE_USB_BUS_SENSE_IO) #define usb_bus_sense PORTAbits.RA1 #else #define usb_bus_sense 1 #endif #define tris_self_power TRISAbits.TRISA2 // Input #if defined(USE_SELF_POWER_SENSE_IO) #define self_power PORTAbits.RA2 #else #define self_power 1 #endif /** L E D ***********************************************************/ #define mInitAllLEDs() LATD &= 0xF0; TRISD &= 0xF0; #define mLED_1 LATDbits.LATD0 #define mLED_2 LATDbits.LATD1 #define mLED_3 LATDbits.LATD2 #define mLED_4 LATDbits.LATD3 #define mLED_1_On() mLED_1 = 1; #define mLED_2_On() mLED_2 = 1; #define mLED_3_On() mLED_3 = 1; #define mLED_4_On() mLED_4 = 1; #define mLED_1_Off() mLED_1 = 0; #define mLED_2_Off() mLED_2 = 0; #define mLED_3_Off() mLED_3 = 0; #define mLED_4_Off() mLED_4 = 0; #define mLED_1_Toggle() mLED_1 = !mLED_1; #define mLED_2_Toggle() mLED_2 = !mLED_2; #define mLED_3_Toggle() mLED_3 = !mLED_3; #define mLED_4_Toggle() mLED_4 = !mLED_4; /** S W I T C H *****************************************************/ #define mInitAllSwitches() TRISBbits.TRISB4=1;TRISBbits.TRISB5=1; #define mInitSwitch2() TRISBbits.TRISB4=1; #define mInitSwitch3() TRISBbits.TRISB5=1; #define sw2 PORTBbits.RB4 #define sw3 PORTBbits.RB5 /** P O T ***********************************************************/ #define mInitPOT() TRISAbits.TRISA0=1;ADCON0=0x01;ADCON2=0x3C; /** S P I : Chip Select Lines ***************************************/ #define tris_cs_temp_sensor TRISBbits.TRISB2 // Output #define cs_temp_sensor LATBbits.LATB2 #define tris_cs_sdmmc TRISBbits.TRISB3 // Output #define cs_sdmmc LATBbits.LATB3 /** S D M M C *******************************************************/ #define TRIS_CARD_DETECT TRISBbits.TRISB4 // Input #define CARD_DETECT PORTBbits.RB4 #define TRIS_WRITE_DETECT TRISAbits.TRISA4 // Input #define WRITE_DETECT PORTAbits.RA4 /** MAX7219 **/ #define LOAD7219 PORTBbits.RB7 #define tris_LOAD7219 TRISBbits.TRISB7 // Output #endif //IO_CFG_HDownload the full Source here.
|
||