Sida 1 av 1

I2C på LPC1768

Postat: 11 september 2011, 18:55:47
av monstrum
Sitter och försöker få igång I2C-kommunikationen på en LPC1768, men får det inte att funka.
När jag försöker generera ett START condition så händer absolut ingenting, varken i registren eller fysiskt på pinnarna.

Jag har satt PINSEL så att pinnarna kopplas till I2C1.
PINMODE_OD är satt så att pinnarna är open-drain.
Det finns 4.7k pull-up:er externt.
Power-control biten för för I2C1 är på.
Klockningen är på med halva CPU-klockan (dvs 50 MHz) och bussen är uppsatt för 400 kHz.

Konfigureringen:

Kod: Markera allt

	PINSEL1_bit.P0_19 = 3;		// Pin function SDA1
	PINSEL1_bit.P0_20 = 3;		// Pin function SCL1
	PINMODE_OD0_bit.P0_19 = 1;	// SDA as open drain
	PINMODE_OD0_bit.P0_20 = 1;	// SCL as open drain

	PCONP_bit.PCI2C1 = 1;		// Enable power and clock
	PCLKSEL1_bit.PCLK_I2C1 = 2;		// I2C clock = 50 MHz

	I2C1CONSET_bit.I2EN = 1;
	I2C1SCLH = 125;		// 50% Low/High SCL clock, 400 kHz
	I2C1SCLL = 125;
Kör sedan detta, men fastnar i while-loopen.

Kod: Markera allt

	I2C1CONCLR_bit.SIC = 1;
	I2C1CONSET_bit.STA = 1;	// Generate START condition
	while( !(I2C1CONSET_bit.SI) );  // Wait for status change
	I2C1CONCLR_bit.STAC = 1;

Jag måste ha missat något, men vad?

Re: I2C på LPC1768

Postat: 12 september 2011, 00:08:13
av Korken
Ta och sno min I2C drivare från KFly.
Den fungerar både med polling och med interrupts. :)

Re: I2C på LPC1768

Postat: 12 september 2011, 00:15:03
av monstrum
Verkar som att jag fått liv i det nu. Tydligen så får man inte cleara interrupt-flaggan innan den är satt, då verkar hela I2C-enheten disabla sig själv av någon märklig anledning.
Läste i erratan också:
3.5 PCLKSELx.1: Peripheral Clock Selection Registers must be set
before enabling and connecting PLL0
Introduction:
A pair of bits in the Peripheral Clock Registers (PCLKSEL0 and PCLKSEL1) controls the
rate of the clock signal that will be supplied to APB0 and APB1 peripherals.
Problem:
If the Peripheral Clock Registers (PCLKSEL0 and PCLKSEL1) are set or changed after
PLL0 is enabled and connected, the value written into the Peripheral Clock Selection
Registers may not take effect. It is not possible to change the Peripheral Clock Selection
settings once PLL0 is enabled and connected.
Work-around:
Peripheral Clock Selection Registers must be set before enabling and connecting PLL0.
Kan vara bra att veta då jag nästan alltid konfigurerar och kopplar in PLL:en innan jag sätter upp någon annan hårdvara.

Re: I2C på LPC1768

Postat: 12 september 2011, 23:02:34
av monstrum
Kan meddela att man inte ska använda _bit registren för direkt bitåtkomst. Kör man t.ex. I2CCONCLR_bit.SIC = 1 i hopp om att detta skall motsvara I2CCONCLR = SI så tror man fel... Det verkar som att kompilatorn (IAR) inte bara skriver bitarna i bitfältet utan gör en read-modify-write och då stänger den automatiskt av alla bitar som är satta och därmed även hela I2C-interfacet med I2EN-biten.
Jaja, man lär så länge man lever.