??? 12/15/06 22:42 Read: times |
#129594 - include file Responding to: ???'s previous message |
Shruthi Kumar said:
Hi,
I wrote this simple application to interface an I2C device (a CODEC Chip) with C8051f310. I put a break point at "ljmp SMBus_ISR" but the code did not stop there. I put a breakpoint at "ljmp timer0_isr" and the code stopped there correctly. Please can you tell me what is that I am missing in the initialization of SMBus ISR? I have put the green LED blink routine so that I know that the main routine is running corrrectly. ; ; this program provides an example of how to configure the I2C Interface ; an internal 24500000hz crystal is used as the system clock source.; ;---------------------------------------------------------------- $include (c8051f310.inc) ; include register definition file. ;----------------------------------------------------------------; EQUATES ;---------------------------------------------------------------- GREEN_LED equ P3.3 ; Green LED: '1' is ON SMB_MTSTA equ 0xE0 ;(MT) start transmitted SMB_MTDB equ 0xC0 ;(MT) data byte transmitted SMB_MRDB equ 0x80 ;(MR) data byte received ; stack stack segment idata ; declare stack segment rseg stack ds 80h ; reserve 128 bytes for stack ;----------------------------------------------------------------------------- ; bit definitions ;----------------------------------------------------------------------------- RW equ 01 ; R/W command bit. 1=READ, 0=WRITE SMB_BUSY equ 02 ; SMBus Busy flag (kept in software) addr_send equ 03 ; if set address sent is acknowledged ;---------------------------------------------------------------- ; byte definitions ;---------------------------------------------------------------- ;---------------------------------------------------------------- ; reset and interrupt vector table ;---------------------------------------------------------------- cseg at 0 ljmp main org 0bh ljmp timer0_isr ; timer0 overflow interrupt org 03Bh ljmp SMBus_ISR ; SMBus Interrupt Vector ;----------------------------------------------------------------------------- ; main program code ;----------------------------------------------------------------------------- pm33 segment code ; declare code segment rseg pm33 ; select code segment using 0 ; using register bank 0 ;----------------------------------------------------------------------------- ; main subroutines ;----------------------------------------------------------------------------- main: anl pca0md, #not(040h) ; clear watchdog enable bit mov sp, #stack-1 ; init stack pointer clr a ; wait at least 1ms djnz acc, $ ; wait 512us djnz acc, $ ; wait 512us mov r0,#07fh clear_RAM: djnz r0,clear_RAM; to clear the RAM bytes 00 to 7Fh call port_io_init; Initialize ports for SCL,SDA and P3.3 (LED) mov OSCICN,#083h ; internal oscillator lcall timer_init ; timer initialisation lcall timer0_init ; timer 0 initialisation acall SMBus_Init ; Initialize SMBus lcall interrupts_init ; interrupts enable clr GREEN_LED ; Initialize LED to OFF Loop2: mov R7, #03h; Code to Blink LED Loop1: mov R6, #00h Loop0: mov R5, #00h djnz R5, $ djnz R6, Loop0 djnz R7, Loop1 cpl GREEN_LED; Toggle LED. jmp Loop2 ;----------------------------------------------------------------------------- ; subroutines ;----------------------------------------------------------------------------- port_io_init: ; P0.0 - SDA (SMBus), Open-Drain, Digital ; P0.1 - SCL (SMBus), Open-Drain, Digital ; P0.2 - Unassigned, Open-Drain, Digital ; P0.3 - Unassigned, Open-Drain, Digital ; P0.4 - Unassigned, Open-Drain, Digital ; P0.5 - Unassigned, Open-Drain, Digital ; P0.6 - Unassigned, Open-Drain, Digital ; P0.7 - Unassigned, Open-Drain, Digital ; P1.0 - Unassigned, Open-Drain, Digital ; P1.1 - Unassigned, Open-Drain, Digital ; P1.2 - Unassigned, Open-Drain, Digital ; P1.3 - Unassigned, Open-Drain, Digital ; P1.4 - Unassigned, Open-Drain, Digital ; P1.5 - Unassigned, Open-Drain, Digital ; P1.6 - Unassigned, Open-Drain, Digital ; P1.7 - Unassigned, Open-Drain, Digital ; P2.0 - Unassigned, Open-Drain, Digital ; P2.1 - Unassigned, Open-Drain, Digital ; P2.2 - Unassigned, Open-Drain, Digital ; P2.3 - Unassigned, Open-Drain, Digital ; P3.3 - Unassigned, Push-pull, Digital orl P0SKIP, #04h ; skip LED pin in crossbar mov XBR0, #004h mov XBR1, #040h ; Enable the Port I/O Crossbar orl P3MDOUT,#08h ; make LED pin output push-pull orl P3MDIN, #08h ; make LED pin input mode digital ret ;TIMER INITIALIZATON timer_init: mov TMOD,#002h ;Mode 2: 8-bit counter/timer with auto-reload mov CKCON,#004h ;1:Counter/Timer 0 uses the system clock. ret ;INTERRUPT INITIALIZATON interrupts_init: setb et0 ; enable timer0 orl eip1,#01 ;SMB0 interrupt set to high priority level. setb ea ; Enable global interrupts ret ;TIMER0 INITIALIZATON for SMBus clock source of 100 kHz timer0_init: mov TH0,#0AFh ;100khz is bit rate from clock source ret ;SMBUS INITIALIZATON SMBus_Init: mov SMB0CF,#080h ;SMBUS interface enabled setb tr0 ; Timer0 enabled orl eie1,#01h ; Enable SMBus (SMB0) Interrupt clr SMB_BUSY ; clear the smbus busy flag ret SMBus_ISR: push PSW ; push ACC ; SMB_ISR_END: clr SI; Clear interrupt flag pop ACC pop PSW reti ; end of file. timer0_isr: reti end /*--------------------------------------------------------------------------- ; ; ; ; ; FILE NAME : C8051F310.H ; TARGET MCUs : C8051F310, 'F311 ; DESCRIPTION : Register/bit definitions for the C8051F31x product family. ; ; REVISION 1.3 ; -- Added ESPI0 and PSPI0 ; ; REVISION 1.2 ; -- Added VDM0CN (0xff) ; ; REVISION 1.1 ; -- SPICFG --> SPI0CFG ; -- SPICKR --> SPI0CKR ; -- SPIDAT --> SPI0DAT ; -- removed CLKMUL (0xb9) ; -- AMUX0N --> AMX0N ; -- AMUX0P --> AMX0P ; ;---------------------------------------------------------------------------*/ /* BYTE Registers */ sfr P0 = 0x80; /* PORT 0 */ sfr SP = 0x81; /* STACK POINTER */ sfr DPL = 0x82; /* DATA POINTER - LOW BYTE */ sfr DPH = 0x83; /* DATA POINTER - HIGH BYTE */ sfr PCON = 0x87; /* POWER CONTROL */ sfr TCON = 0x88; /* TIMER CONTROL */ sfr TMOD = 0x89; /* TIMER MODE */ sfr TL0 = 0x8A; /* TIMER 0 - LOW BYTE */ sfr TL1 = 0x8B; /* TIMER 1 - LOW BYTE */ sfr TH0 = 0x8C; /* TIMER 0 - HIGH BYTE */ sfr TH1 = 0x8D; /* TIMER 1 - HIGH BYTE */ sfr CKCON = 0x8E; /* CLOCK CONTROL */ sfr PSCTL = 0x8F; /* PROGRAM STORE R/W CONTROL */ sfr P1 = 0x90; /* PORT 1 */ sfr TMR3CN = 0x91; /* TIMER 3 CONTROL */ sfr TMR3RLL = 0x92; /* TIMER 3 RELOAD LOW */ sfr TMR3RLH = 0x93; /* TIMER 3 RELOAD HIGH */ sfr TMR3L = 0x94; /* TIMER 3 LOW BYTE */ sfr TMR3H = 0x95; /* TIMER 3 HIGH BYTE */ sfr SCON0 = 0x98; /* SERIAL PORT 0 CONTROL */ sfr SBUF0 = 0x99; /* SERIAL PORT 0 BUFFER */ sfr CPT1CN = 0x9A; /* COMPARATOR 1 CONTROL */ sfr CPT0CN = 0x9B; /* COMPARATOR 0 CONTROL */ sfr CPT1MD = 0x9C; /* COMPARATOR 1 MODE */ sfr CPT0MD = 0x9D; /* COMPARATOR 0 MODE */ sfr CPT1MX = 0x9E; /* COMPARATOR 1 MUX */ sfr CPT0MX = 0x9F; /* COMPARATOR 0 MUX */ sfr P2 = 0xA0; /* PORT 2 */ sfr SPI0CFG = 0xA1; /* SPI0 CONFIGURATION */ sfr SPI0CKR = 0xA2; /* SPI0 CLOCK CONFIGURATION */ sfr SPI0DAT = 0xA3; /* SPI0 DATA */ sfr P0MDOUT = 0xA4; /* PORT 0 OUTPUT MODE */ sfr P1MDOUT = 0xA5; /* PORT 1 OUTPUT MODE */ sfr P2MDOUT = 0xA6; /* PORT 2 OUTPUT MODE */ sfr P3MDOUT = 0xA7; /* PORT 3 OUTPUT MODE */ sfr IE = 0xA8; /* INTERRUPT ENABLE */ sfr CLKSEL = 0xA9; /* CLOCK SOURCE SELECT */ sfr EMI0CN = 0xAA; /* EXTERNAL MEMORY INTERFACE CONTROL */ sfr P3 = 0xB0; /* PORT 3 */ sfr OSCXCN = 0xB1; /* EXTERNAL OSCILLATOR CONTROL */ sfr OSCICN = 0xB2; /* INTERNAL OSCILLATOR CONTROL */ sfr OSCICL = 0xB3; /* INTERNAL OSCILLATOR CALIBRATION */ sfr FLACL = 0xB5; /* FLASH ACCESS LIMIT */ sfr FLSCL = 0xB6; /* FLASH SCALE */ sfr FLKEY = 0xB7; /* FLASH LOCK & KEY */ sfr IP = 0xB8; /* INTERRUPT PRIORITY */ sfr AMX0N = 0xBA; /* ADC0 MUX NEGATIVE CHANNEL SELECTION */ sfr AMX0P = 0xBB; /* ADC0 MUX POSITIVE CHANNEL SELECTION */ sfr ADC0CF = 0xBC; /* ADC0 CONFIGURATION */ sfr ADC0L = 0xBD; /* ADC0 DATA LOW */ sfr ADC0H = 0xBE; /* ADC0 DATA HIGH */ sfr SMB0CN = 0xC0; /* SMBUS CONTROL */ sfr SMB0CF = 0xC1; /* SMBUS CONFIGURATION */ sfr SMB0DAT = 0xC2; /* SMBUS DATA */ sfr ADC0GTL = 0xC3; /* ADC0 GREATER-THAN LOW */ sfr ADC0GTH = 0xC4; /* ADC0 GREATER-THAN HIGH */ sfr ADC0LTL = 0xC5; /* ADC0 LESS-THAN LOW */ sfr ADC0LTH = 0xC6; /* ADC0 LESS-THAN HIGH */ sfr TMR2CN = 0xC8; /* TIMER 2 CONTROL */ sfr TMR2RLL = 0xCA; /* TIMER 2 RELOAD LOW */ sfr TMR2RLH = 0xCB; /* TIMER 2 RELOAD HIGH */ sfr TMR2L = 0xCC; /* TIMER 2 LOW BYTE */ sfr TMR2H = 0xCD; /* TIMER 2 HIGH BYTE */ sfr PSW = 0xD0; /* PROGRAM STATUS WORD */ sfr REF0CN = 0xD1; /* VOLTAGE REFERENCE 0 CONTROL */ sfr P0SKIP = 0xD4; /* PORT 0 CROSSBAR SKIP */ sfr P1SKIP = 0xD5; /* PORT 1 CROSSBAR SKIP */ sfr P2SKIP = 0xD6; /* PORT 2 CROSSBAR SKIP */ sfr PCA0CN = 0xD8; /* PCA0 CONTROL */ sfr PCA0MD = 0xD9; /* PCA0 MODE */ sfr PCA0CPM0 = 0xDA; /* PCA0 MODULE 0 MODE */ sfr PCA0CPM1 = 0xDB; /* PCA0 MODULE 1 MODE */ sfr PCA0CPM2 = 0xDC; /* PCA0 MODULE 2 MODE */ sfr PCA0CPM3 = 0xDD; /* PCA0 MODULE 3 MODE */ sfr PCA0CPM4 = 0xDE; /* PCA0 MODULE 4 MODE */ sfr ACC = 0xE0; /* ACCUMULATOR */ sfr XBR0 = 0xE1; /* DIGITAL CROSSBAR CONFIGURATION REGISTER 0 */ sfr XBR1 = 0xE2; /* DIGITAL CROSSBAR CONFIGURATION REGISTER 1 */ sfr IT01CF = 0xE4; /* INT0/INT1 CONFIGURATION */ sfr EIE1 = 0xE6; /* EXTERNAL INTERRUPT ENABLE 1 */ sfr ADC0CN = 0xE8; /* ADC 0 CONTROL */ sfr PCA0CPL1 = 0xE9; /* PCA0 MODULE 1 CAPTURE/COMPARE REGISTER LOW BYTE */ sfr PCA0CPH1 = 0xEA; /* PCA0 MODULE 1 CAPTURE/COMPARE REGISTER HIGH BYTE */ sfr PCA0CPL2 = 0xEB; /* PCA0 MODULE 2 CAPTURE/COMPARE REGISTER LOW BYTE */ sfr PCA0CPH2 = 0xEC; /* PCA0 MODULE 2 CAPTURE/COMPARE REGISTER HIGH BYTE */ sfr PCA0CPL3 = 0xED; /* PCA0 MODULE 3 CAPTURE/COMPARE REGISTER LOW BYTE */ sfr PCA0CPH3 = 0xEE; /* PCA0 MODULE 3 CAPTURE/COMPARE REGISTER HIGH BYTE */ sfr RSTSRC = 0xEF; /* RESET SOURCE */ sfr B = 0xF0; /* B REGISTER */ sfr P0MDIN = 0xF1; /* PORT 0 INPUT MODE REGISTER */ sfr P1MDIN = 0xF2; /* PORT 1 INPUT MODE REGISTER */ sfr P2MDIN = 0xF3; /* PORT 2 INPUT MODE REGISTER */ sfr P3MDIN = 0xF4; /* PORT 3 INPUT MODE REGISTER */ sfr EIP1 = 0XF6; /* EXTERNAL INTERRUPT PRIORITY 1 */ sfr SPI0CN = 0xF8; /* SPI0 CONTROL */ sfr PCA0L = 0xF9; /* PCA0 COUNTER REGISTER LOW BYTE */ sfr PCA0H = 0xFA; /* PCA0 COUNTER REGISTER HIGH BYTE */ sfr PCA0CPL0 = 0xFB; /* PCA MODULE 0 CAPTURE/COMPARE REGISTER LOW BYTE */ sfr PCA0CPH0 = 0xFC; /* PCA MODULE 0 CAPTURE/COMPARE REGISTER HIGH BYTE */ sfr PCA0CPL4 = 0xFD; /* PCA MODULE 4 CAPTURE/COMPARE REGISTER LOW BYTE */ sfr PCA0CPH4 = 0xFE; /* PCA MODULE 4 CAPTURE/COMPARE REGISTER HIGH BYTE */ sfr VDM0CN = 0xFF; /* VDD MONITOR CONTROL */ /* BIT Registers */ /* TCON 0x88 */ sbit IT0 = TCON ^ 0; /* EXT INTERRUPT 0 TYPE */ sbit IE0 = TCON ^ 1; /* EXT INTERRUPT 0 EDGE FLAG */ sbit IT1 = TCON ^ 2; /* EXT INTERRUPT 1 TYPE */ sbit IE1 = TCON ^ 3; /* EXT INTERRUPT 1 EDGE FLAG */ sbit TR0 = TCON ^ 4; /* TIMER 0 ON/OFF CONTROL */ sbit TF0 = TCON ^ 5; /* TIMER 0 OVERFLOW FLAG */ sbit TR1 = TCON ^ 6; /* TIMER 1 ON/OFF CONTROL */ sbit TF1 = TCON ^ 7; /* TIMER 1 OVERFLOW FLAG */ /* SCON0 0x98 */ sbit RI0 = SCON0 ^ 0; /* RECEIVE INTERRUPT FLAG */ sbit TI0 = SCON0 ^ 1; /* TRANSMIT INTERRUPT FLAG */ sbit RB80 = SCON0 ^ 2; /* RECEIVE BIT 8 */ sbit TB80 = SCON0 ^ 3; /* TRANSMIT BIT 8 */ sbit REN0 = SCON0 ^ 4; /* RECEIVE ENABLE */ sbit MCE0 = SCON0 ^ 5; /* MULTIPROCESSOR COMMUNICATION ENABLE */ sbit S0MODE = SCON0 ^ 7; /* SERIAL MODE CONTROL BIT 0 */ /* IE 0xA8 */ sbit EX0 = IE ^ 0; /* EXTERNAL INTERRUPT 0 ENABLE */ sbit ET0 = IE ^ 1; /* TIMER 0 INTERRUPT ENABLE */ sbit EX1 = IE ^ 2; /* EXTERNAL INTERRUPT 1 ENABLE */ sbit ET1 = IE ^ 3; /* TIMER 1 INTERRUPT ENABLE */ sbit ES0 = IE ^ 4; /* UART0 INTERRUPT ENABLE */ sbit ET2 = IE ^ 5; /* TIMER 2 INTERRUPT ENABLE */ sbit ESPI0 = IE ^ 6; /* SPI0 INTERRUPT ENABLE */ sbit EA = IE ^ 7; /* GLOBAL INTERRUPT ENABLE */ /* IP 0xB8 */ sbit PX0 = IP ^ 0; /* EXTERNAL INTERRUPT 0 PRIORITY */ sbit PT0 = IP ^ 1; /* TIMER 0 PRIORITY */ sbit PX1 = IP ^ 2; /* EXTERNAL INTERRUPT 1 PRIORITY */ sbit PT1 = IP ^ 3; /* TIMER 1 PRIORITY */ sbit PS0 = IP ^ 4; /* UART0 PRIORITY */ sbit PT2 = IP ^ 5; /* TIMER 2 PRIORITY */ sbit PSPI0 = IP ^ 6; /* SPIO PRIORITY */ /* SMB0CN 0xC0 */ sbit SI = SMB0CN ^ 0; /* SMBUS0 INTERRUPT FLAG */ sbit ACK = SMB0CN ^ 1; /* ACKNOWLEDGE FLAG */ sbit ARBLOST = SMB0CN ^ 2; /* ARBITRATION LOST INDICATOR */ sbit ACKRQ = SMB0CN ^ 3; /* ACKNOWLEDGE REQUEST */ sbit STO = SMB0CN ^ 4; /* STOP FLAG */ sbit STA = SMB0CN ^ 5; /* START FLAG */ sbit TXMODE = SMB0CN ^ 6; /* TRANSMIT MODE INDICATOR */ sbit MASTER = SMB0CN ^ 7; /* MASTER/SLAVE INDICATOR */ /* TMR2CN 0xC8 */ sbit T2XCLK = TMR2CN ^ 0; /* TIMER 2 EXTERNAL CLOCK SELECT */ sbit TR2 = TMR2CN ^ 2; /* TIMER 2 ON/OFF CONTROL */ sbit T2SPLIT = TMR2CN ^ 3; /* TIMER 2 SPLIT MODE ENABLE */ sbit TF2LEN = TMR2CN ^ 5; /* TIMER 2 LOW BYTE INTERRUPT ENABLE */ sbit TF2L = TMR2CN ^ 6; /* TIMER 2 LOW BYTE OVERFLOW FLAG */ sbit TF2H = TMR2CN ^ 7; /* TIMER 2 HIGH BYTE OVERFLOW FLAG */ /* PSW 0xD0 */ sbit P = PSW ^ 0; /* ACCUMULATOR PARITY FLAG */ sbit F1 = PSW ^ 1; /* USER FLAG 1 */ sbit OV = PSW ^ 2; /* OVERFLOW FLAG */ sbit RS0 = PSW ^ 3; /* REGISTER BANK SELECT 0 */ sbit RS1 = PSW ^ 4; /* REGISTER BANK SELECT 1 */ sbit F0 = PSW ^ 5; /* USER FLAG 0 */ sbit AC = PSW ^ 6; /* AUXILIARY CARRY FLAG */ sbit CY = PSW ^ 7; /* CARRY FLAG */ /* PCA0CN 0xD8H */ sbit CCF0 = PCA0CN ^ 0; /* PCA0 MODULE 0 CAPTURE/COMPARE FLAG */ sbit CCF1 = PCA0CN ^ 1; /* PCA0 MODULE 1 CAPTURE/COMPARE FLAG */ sbit CCF2 = PCA0CN ^ 2; /* PCA0 MODULE 2 CAPTURE/COMPARE FLAG */ sbit CCF3 = PCA0CN ^ 3; /* PCA0 MODULE 3 CAPTURE/COMPARE FLAG */ sbit CCF4 = PCA0CN ^ 4; /* PCA0 MODULE 4 CAPTURE/COMPARE FLAG */ sbit CR = PCA0CN ^ 6; /* PCA0 COUNTER RUN CONTROL */ sbit CF = PCA0CN ^ 7; /* PCA0 COUNTER OVERFLOW FLAG */ /* ADC0CN 0xE8H */ sbit AD0CM0 = ADC0CN ^ 0; /* ADC0 CONVERSION MODE SELECT 0 */ sbit AD0CM1 = ADC0CN ^ 1; /* ADC0 CONVERSION MODE SELECT 1 */ sbit AD0CM2 = ADC0CN ^ 2; /* ADC0 CONVERSION MODE SELECT 2 */ sbit AD0WINT = ADC0CN ^ 3; /* ADC0 WINDOW COMPARE INTERRUPT FLAG */ sbit AD0BUSY = ADC0CN ^ 4; /* ADC0 BUSY FLAG */ sbit AD0INT = ADC0CN ^ 5; /* ADC0 CONVERISION COMPLETE INTERRUPT FLAG */ sbit AD0TM = ADC0CN ^ 6; /* ADC0 TRACK MODE */ sbit AD0EN = ADC0CN ^ 7; /* ADC0 ENABLE */ /* SPI0CN 0xF8H */ sbit SPIF = SPI0CN ^ 7; /* SPI 0 INTERRUPT FLAG */ sbit WCOL = SPI0CN ^ 6; /* SPI 0 WRITE COLLISION FLAG */ sbit MODF = SPI0CN ^ 5; /* SPI 0 MODE FAULT FLAG */ sbit RXOVRN = SPI0CN ^ 4; /* SPI 0 RX OVERRUN FLAG */ sbit TXBSY = SPI0CN ^ 3; /* SPI 0 SLAVE SELECT MODE 1 */ sbit SLVSEL = SPI0CN ^ 2; /* SPI 0 SLAVE SELECT MODE 0 */ sbit TXBMT = SPI0CN ^ 1; /* SPI 0 TRANSMIT BUFFER EMPTY */ sbit SPIEN = SPI0CN ^ 0; /* SPI 0 SPI ENABLE */ |
Topic | Author | Date |
I2C C8051F310 | 01/01/70 00:00 | |
post at silabs forum | 01/01/70 00:00 | |
question posted | 01/01/70 00:00 | |
Post c8051f310.inc. | 01/01/70 00:00 | |
no link exist | 01/01/70 00:00 | |
include file | 01/01/70 00:00 | |
SPI interrupt address 03Bh or 033h | 01/01/70 00:00 | |
Set the STA bit to initiate the vector![]() | 01/01/70 00:00 |