|
|
View previous topic :: View next topic |
Author |
Message |
Borodin
Joined: 28 Jul 2006 Posts: 4
|
I2C slave problem/USB HID |
Posted: Sun Aug 06, 2006 2:56 pm |
|
|
Hello,
I'm using a i2c master who's sending data to slave address 0x46. I'm using a PIC18F4550 as slave. I put the data and the address I received in hex-format on the screen (hyperTerminal) via RS232. But I also want to put the address and data on the screen with my device configured as a USB HID device.
I tested the USB-module (HID) and it works fine. I changed the report counter in a .h-file from 2 to 4 (for sending 4 bytes to the host). Then I tested the i2c interrupt and it also works fine. But when I put them together in one project, my USB never gets enumerated.
Can anyone tell me if there is a fault, any suggestions ... ?
All comments are welcome.
Thanks.
Code: | /*******************************************************************************
Configuratie, includes en defines
*******************************************************************************/
#include <18F4550.h>
#device adc=8
#define __USB_PIC_PERIF__ 1 //interne USB peripheral gebruiken
//instellingen en configuraties
#FUSES NOWDT //Geen Watch Dog Timer
#FUSES WDT32768 //Watch Dog Timer Postscale = 1:32768
#FUSES HSPLL //High Speed Crystal met PLL ge-enabled
#FUSES NOPROTECT //Code niet beschermd van lezen
#FUSES NOBROWNOUT //Geen brownout reset
#FUSES BORV46 //Brownout reset op 4.6V
#FUSES PUT //Power Up Timer
#FUSES NOCPD //Geen EE bescherming
#FUSES STVREN //Stack full/underflow zal reset veroorzaken
#FUSES NODEBUG //Geen Debug mode voor ICD
#FUSES NOLVP //Geen Low Voltage Programmeren op pin B5(PIC18)
#FUSES NOWRT //Programma geheugen niet schrijf-beveiligd
#FUSES NOWRTD //Data EEPROM niet schrijf-beveiligd
#FUSES NOIESO //Internal External Switch Over mode disabled
#FUSES NOFCMEN //Fail-safe clock monitor disabled
#FUSES NOPBADEN //PORTB pins zijn geconfigureerd als digitale
//ingangskanalen bij RESET
#FUSES NOWRTC //registers niet schrijf-beveiligd
#FUSES NOWRTB //Boot block niet schrijf-beveiligd
#FUSES NOEBTR //Geheugen niet lees-beveiligd
#FUSES NOEBTRB //Boot block niet lees-beveiligd
#FUSES NOCPB //Geen Boot Block code bescherming
#FUSES NOMCLR //Master Clear pin disabled
#FUSES LPT1OSC //Timer1 geconfigureerd voor low-power werking
#FUSES NOXINST //Extended set extensie en ge-indexeerde Addressing
//mode disabled (Legacy mode)
#FUSES PLL6 //24 MHz externe OSC
#FUSES VREGEN //USB Voltage Regulator Enable
#FUSES CPUDIV1 //96MHz PLL, divided by 2 for CPU clock
#FUSES USBDIV //Clock source from 96 MHz PLL/2
#FUSES NOLPT1OSC //Timer1 oscillator geconfigureerd voor high power
//(low power timer1 osc enable)
#FUSES CCP2B3 //CCP2 input/output is multiplexed met RB3
#FUSES NOICPRT //Dedicated in Circuit Debug/Programming enable
#FUSES NOXINST //Extended Instruction Set disabled
#use delay(clock=48000000)
#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use i2c(Slave,sda=PIN_B0,scl=PIN_B1,address=0x46 ,FORCE_HW)
//include HID handling code.
#DEFINE USB_HID_DEVICE TRUE
/*de volgede defines zijn nodig om de TX endpoint1 (EP1) te enablen en om buffer-
ruimte te alloceren. */
#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT //IN interrupt transfers voor EP1
#define USB_EP1_TX_SIZE 8 //alloceer 8 bytes in de hardware voor het verzenden
/*de volgede defines zijn nodig om de RX endpoint1 (EP1) te enablen en om buffer-
ruimte te alloceren. */
#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT //OUT interrupt transfers voor EP1
#define USB_EP1_RX_SIZE 8 //alloceer 8 bytes in de hardware voor het ontvangen
//Microchip 18Fxx5x hardware layer voor usb.c
#include <pic18_usb.h>
//USB configuratie en device descriptors voor dit USB device
#include <usb_desc_hid.h>
//handlet usb setup tokens en get descriptor reports
#include <usb.c>
#DEFINE LED_RUNNING PIN_A3
#DEFINE LED_ISR PIN_A4
#DEFINE LED1 PIN_A2
#define LED_ON output_high
#define LED_OFF output_low
//adresbyte and buffer array definiëren
BYTE address, buffer[10]; //zie interrupt en while-lus
//BYTE incoming, state;
int r = 0;
/*******************************************************************************
i²c_interrupt
*******************************************************************************/
//enkel adres 0x46 wordt ge-acknoledged, de instelling van meerdere adressen
//geeft uitvoeringsfouten en while lus wordt niet uitgevoerd.
#INT_SSP
void ssp_interupt ()
{
BYTE incoming,state;
state = i2c_isr_state();
if(state < 0x80) //Master is sending data
{
incoming = i2c_read();
if(state == 1) //First received byte is address
address = incoming;
if(state == 2) //Second received byte is data
buffer[address] = incoming;
}
r=1;//zie while-lus
OUTPUT_HIGH(LED_ISR);
}
void usb_debug_task(void) {
static int8 last_connected;
static int8 last_enumerated;
int8 new_connected;
int8 new_enumerated;
new_connected=usb_attached();
new_enumerated=usb_enumerated();
if (new_enumerated)
LED_ON(LED1);
else
LED_OFF(LED1);
if (new_connected && !last_connected) //USB geconnecteerd, maar nog niet ge-
//enumereerd door de host.
printf("\r\n\nUSB connected, waiting for enumeration...");
if (!new_connected && last_connected) //USB nog niet geconnecteerd
printf("\r\n\nUSB disconnected, waiting for connection...");
if (new_enumerated && !last_enumerated) //USB werd geënumereerd door de host
printf("\r\n\nUSB enumerated by PC/HOST");
if (!new_enumerated && last_enumerated) //nog niet tegengekomen, maar heb het
//wel gedefinieerd.
printf("\r\n\nUSB unenumerated by PC/HOST, waiting for enumeration...");
last_connected=new_connected;
last_enumerated=new_enumerated;
}
/*******************************************************************************
main-programma
*******************************************************************************/
void main()
{
int8 out_data[20]; //out: PIC => HOST
int8 send_timer=0;
int i = 0;
BYTE testwaarde = 0x00;
BYTE testwaarde2 = 0x00;
LED_ON(LED1);
usb_init_cs();
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(GLOBAL); //Globale interrupt Call
enable_interrupts(INT_SSP); //Interrupt i2c
setup_low_volt_detect(FALSE);
setup_oscillator(False);
printf("\r\n\Running...\r\n");
OUTPUT_HIGH(LED_RUNNING);
while (TRUE) //while-lus
{
usb_task();
usb_debug_task();
if (usb_enumerated())
{
OUTPUT_HIGH(PIN_A5);//LED indicates that system is enumerated
if (r==1) //er is een interrupt geweest
{
if (!send_timer)
{
send_timer=250;
//gegevens in de databuffer steken
out_data[0]=address;
out_data[1]=buffer[address];
out_data[2]=testwaarde;
out_data[3]=testwaarde2;
//naar buiten brengen via USB en RS232
if (usb_put_packet(1, out_data, 4 ,USB_DTS_TOGGLE))//4 bytes zenden naar de host
{
printf("\r\n\Address = 0x%X",out_data[0]);
printf("\r\n\Buffer[address] = 0x%X",out_data[1]);
printf("\r\n\------------------->testwaarde = 0x%X",out_data[2]);
printf("\r\n\------------------->testwaarde2 = 0x%X",out_data[3]);
}
}
send_timer--;
delay_ms(1);
//OUTPUT_LOW(LED_ISR);
r=0;
testwaarde++;
}
if (testwaarde == 0xFF)
{
testwaarde = 0x00;
testwaarde2++;
if (testwaarde2 == 0xFF)
testwaarde2 = 0x00;
}
}
}//einde van de while lus
}//einde van de main funtie
|
Last edited by Borodin on Mon Aug 07, 2006 1:38 am; edited 2 times in total |
|
|
Borodin
Joined: 28 Jul 2006 Posts: 4
|
|
Posted: Sun Aug 06, 2006 2:57 pm |
|
|
The code isn't coming thru. |
|
|
Borodin
Joined: 28 Jul 2006 Posts: 4
|
|
Posted: Sun Aug 06, 2006 3:02 pm |
|
|
Thank you for that, PCM programmer.
Last edited by Borodin on Mon Aug 07, 2006 1:33 am; edited 1 time in total |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Aug 06, 2006 3:05 pm |
|
|
Quote: | The code isn't coming thru. |
Edit your post, fix any problems, and then select the checkbox below the
posting window that says "Disable HTML in this post". Then click Submit. |
|
|
PICoHolic
Joined: 04 Jan 2005 Posts: 224
|
|
Posted: Fri Apr 27, 2007 2:17 am |
|
|
Quote: | Then I tested the i2c interrupt and it also works fine. |
Hello Borodin,
Could you plz tell me under which conditions (FUSES, compiler vesion etc...) it worked fine (I2C Slave) ?
Thank you! |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|