Hallo, ich komme nicht weiter mit dem I2C Bus. Die Beispiele von TI
kenne ich, aber die lesen zum Beispiel bei dem DAC alle 3Bytes in einer
Funktion. Wenn ich auch msb und lsb in einer einzigen Funktion lese,
geht das auch so zum Bsp.:
void i2c_read(void) {
while (I2CBUSY & I2CDCTL); // wait for i2C ready
i2c_readInit(); // set to readMode
I2CTCTL |= I2CSTT + I2CSTP; // I2CRM =0; Receive, ST, SP
while((I2CIFG & RXRDYIFG) != RXRDYIFG); // wait for Data Ready
msb = I2CDRB;
while((I2CIFG & RXRDYIFG) != RXRDYIFG); // wait for Data Ready
lsb = I2CDRB;
}
Aber ich möchte wenns geht Byte für Byte mit einer Funktion lesen.
Also
init
start
high = i2c_readAck();
low = i2c_readNak();
stop
Die readNak() funktioniert auch aber die readAck nicht, hat niemand
sowas schonmal gemacht?
Hier noch die restlichen Funktionen.
void i2c_init(void){
P3SEL |= 0x0A; // select module function for the used I2C pins
P3DIR &= ~0x0A; // select ports for I2C function
U0CTL |= I2C+SYNC; // (1) Select I2C mode with SWRST=1
U0CTL &= ~I2CEN; // (2) disable the I2C module
I2CTCTL = I2CSSEL_2+I2CRM; // byte mode, repeat mode
I2CPSC = 0x02; // I2C clock = clock source/I2CPSC
// für 8MHz Quarz / (3+1) ==> 2MHz
I2CSCLH = 0x08; // SCL high period = (8+2)*I2C clock
// 1/2MHz ==> 0.5µSec * 10 => 5µSec
I2CSCLL = 0x08; // SCL low period => wie I2CSLH
// SCL Low, 5µSec + SCL High, 5µSec = 10µSec
// ==> 1/10µSec = 100kHz I2C Clock
I2CIFG = 0;
}
unsigned char i2c_start(unsigned char address) {
//I2CNDAT = 0x01; // I2C Data count (one byte)
I2CSA = address; //set I2C Slave Address
U0CTL |= I2CEN; // (4) set I2CEN via software
return 0;
}
static void i2c_readInit(void){
// Initialization of the I2C Module for Read operation.
U0CTL |= MST; // define Master Mode
I2CTCTL &= ~I2CTRX; // I2CTRX=0 => Receive Mode (R/W bit = 1)
I2CIFG &= ~TXRDYIFG; // clear Receive Data ready
//I2CIE = RXRDYIE; // enable Receive ready interrupt
}
unsigned char i2c_readNak(void) {
while (I2CBUSY & I2CDCTL); // wait for i2C ready
i2c_readInit(); // set to readMode
I2CTCTL |= I2CSTT + I2CSTP; // I2CRM =0; Receive, ST,STP
while((I2CIFG & RXRDYIFG) != RXRDYIFG); // wait for Data Ready
return I2CDRB;
}
unsigned char i2c_readAck(void) {
while (I2CBUSY & I2CDCTL); // wait for i2C ready
i2c_readInit(); // set to readMode
I2CTCTL |= I2CSTT ; // I2CRM =0; Receive, ST
while((I2CIFG & RXRDYIFG) != RXRDYIFG); // wait for Data Ready
return I2CDRB;
}
@Martin Danke nochmal, was machst du eigentlich mit einer CMOS-Kamera
am msp? Bildverarbeitung?
Besten Dank im Voraus
mfg mathias