Hallo,
ich möchte vom ARM-LPC2xxx-Mikrocontroller an LCD-Display über ein
I2C-Bus Daten schicken, also "Bilder auf LCD-Display übertragen" und
habe ein Beispiel für Datenübertrageung über ein I2C-Bus, aber nicht für
LCD, bei NXP gefunden:
1 | #include"LPC210x.h"
|
2 | void Initialize(void);
|
3 | /* I2C ISR */
|
4 | __irq void I2C _ISR(void);
|
5 | /* Master Transmitter states */
|
6 | void ISR_8(void);
|
7 | void ISR_18(void);
|
8 | void ISR_28(void);
|
9 | /*************************** MAIN ************************/
|
10 | int main(){
|
11 | /* Initialize system */
|
12 | Initialize ();
|
13 | /* Send start bit */
|
14 | I2C ONSET=0x60;
|
15 | /* Do forever */
|
16 | while(1)
|
17 | { IOCLR=0x40;
|
18 | IOSET=0x40; }
|
19 | }
|
20 | /*************** System Initialization ***************/
|
21 | void Initialize()
|
22 | {
|
23 | /* Remap interrupt vectors to SRAM */
|
24 | MEMMAP=0x2;
|
25 | /* Initialize GPIO ports to be used as indicators */
|
26 | IODIR=0xF0;
|
27 | IOSET=0xF0;
|
28 | /* Initialize Pin Connect Block */
|
29 | PINSEL0=0x50;
|
30 | /* Initialize I2C */
|
31 | I2CONCLR=0x6c;/* clearing all flags */
|
32 | I2CONSET=0x40; /* enabling I2C */
|
33 | I2SCLH=0xC; /* 100 KHz */
|
34 | I2SCLL=0xD;
|
35 | /* Initialize VIC for I2C use */
|
36 | VICINTSEL=0x0; /* selecting IRQ */
|
37 | VICINTEN= 0x200; /* enabling I2C */
|
38 | VICCNTL0= 0x29; /* highest priority and enabled */
|
39 | VICVADDR0=(unsigned long) I2C_ISR;
|
40 | /* ISR address written to the respective address register*/
|
41 | }
|
42 | /********************** I2C ISR **************************/
|
43 | __irq void I2C_ISR()
|
44 | {
|
45 | int temp=0;
|
46 | temp=I2STAT;
|
47 | switch(temp)
|
48 | {
|
49 | case 8:
|
50 | ISR_8();
|
51 | break;
|
52 | case 24:
|
53 | ISR_18();
|
54 | break;
|
55 | case 40:
|
56 | ISR_28();
|
57 | break;
|
58 | default :
|
59 | break;
|
60 | }
|
61 | VICVADDR=0xFF;
|
62 | }
|
63 | /* I2C states*/
|
64 | /* Start condition transmitted */
|
65 | void ISR_8()
|
66 | {
|
67 | /* Port Indicator */
|
68 | IOCLR=0x10;
|
69 | /* Slave address + write */
|
70 | I2DAT=0x74;
|
71 | /* Clear SI and Start flag */
|
72 | I2CONCLR=0x28;
|
73 | /* Port Indicator */
|
74 | IOSET=0x10;
|
75 | }
|
76 | /* Acknowledgement received from slave for slave address */
|
77 | void ISR_18()
|
78 | {
|
79 | /* Port Indicator */
|
80 | IOCLR=0x20;
|
81 | /* Data to be transmitted */
|
82 | I2DAT=0x55;
|
83 | /* clear SI */
|
84 | I2CONCLR=0x8;
|
85 | /* Port Indicator */
|
86 | IOSET=0x20;
|
87 | }
|
88 | /* Acknowledgement received from slave for byte transmitted from master. Stopcondition is transmitted in this state signaling the end of transmission */
|
89 | void ISR_28()
|
90 | {
|
91 | /* Port Indicator */
|
92 | IOCLR=0x80;
|
93 | /* Transmit stop condition */
|
94 | I2CONSET=0x10;
|
95 | /* clear SI */
|
96 | I2CONCLR=0x8;
|
97 | /* Port Indicator */
|
98 | IOSET=0x80;
|
99 | }
|
Ich bin ein Anfänger und meine Frage wäre: findet die vollstendige
Datenübertragung(Startbit, Slaveadresse+W,Daten,Stopbit) nur ein mal
statt oder die wiederholt sich regelmasig? Ich habe ein
Versändnisproblemm und weiß nicht wie Interupt bei Datenübertragung in
Hardware funktionirt :(
Danke im voraus.