Other Parts Discussed in Thread: C2000WARE
Hi
I want to configure the I2C to use no interrupt but the TX FIFO in master mode only
I need only Tx as a master, no reading (Rx). It is to control an OLED screen SSD1306
After many searches and examples I managed to have this config
The configuration
//-----------------------------------------------------------------------------
// InitI2C - This function initializes the I2C to a known state.
void InitI2C()
{
// Initialize I2C-A
I2caRegs.I2CMDR.all = 0x0000;
I2caRegs.I2CSAR = I2C_SLAVE_ADDR; // Slave address
// 90 MHz/( (8+1)(10+5 + 5+5)) = 400 kHz
I2caRegs.I2CPSC.all = 8; // Prescaler - need 7-12 Mhz on module clk
I2caRegs.I2CCLKL = 10; // NOTE: must be non zero
I2caRegs.I2CCLKH = 5; // NOTE: must be non zero
//I2caRegs.I2CIER.all = 0x24; // Enable SCD & ARDY interrupts 0010 0100
I2caRegs.I2CIER.all = 0x00; // No interrupt
// I2caRegs.I2CIER.bit.AAS = 0; // Addressed as slave interrupt enable bit
// I2caRegs.I2CIER.bit.SCD = 1; // Stop condition detected interrupt enable bit
// I2caRegs.I2CIER.bit.XRDY = 0; // Transmit-data-ready interrupt enable bit
// I2caRegs.I2CIER.bit.RRDY = 0; // Receive-data-ready interrupt enable bit
// I2caRegs.I2CIER.bit.ARDY = 1; // Register-access-ready interrupt enable bit
// I2caRegs.I2CIER.bit.NACK = 0; // No-acknowledgment interrupt enable bit
// I2caRegs.I2CIER.bit.ARBL = 0; // Arbitration-lost interrupt enable bit
//I2caRegs.I2CFFTX.all = 0x6000; // Enable FIFO mode and TXFIFO
I2caRegs.I2CFFTX.bit.I2CFFEN = 1; // Enable the I2C FIFO mode
I2caRegs.I2CFFTX.bit.TXFFRST = 1; // Enable the transmit FIFO operation
I2caRegs.I2CFFTX.bit.TXFFINTCLR = 0; // Clear the TXFFINT flag
I2caRegs.I2CFFTX.bit.TXFFIENA = 0; // TXFFINT flag does not generate an interrupt when set
I2caRegs.I2CFFTX.bit.TXFFIL = 0; // Transmit FIFO interrupt level
//I2caRegs.I2CFFRX.all = 0x0000; // No RXFIFO, no clear RXFFINT
I2caRegs.I2CFFRX.bit.RXFFRST = 0; // **Disable** the receive FIFO operation
I2caRegs.I2CFFRX.bit.RXFFINTCLR = 0; // Clear the RXFFINT flag
I2caRegs.I2CFFRX.bit.RXFFIENA = 0; // RXFFINT flag does generate an interrupt when set
I2caRegs.I2CFFRX.bit.RXFFIL = 0; // Receive FIFO interrupt level
//I2caRegs.I2CMDR.all = 0x0020; // Take I2C out of reset,Stop I2C when suspended
I2caRegs.I2CMDR.bit.NACKMOD = 0; // NACK mode bit
I2caRegs.I2CMDR.bit.FREE = 0; // Stop I2C when suspended
I2caRegs.I2CMDR.bit.STT = 0; // START condition bit
I2caRegs.I2CMDR.bit.STP = 0; // STOP condition bit
I2caRegs.I2CMDR.bit.MST = 0; // Slave mode
I2caRegs.I2CMDR.bit.TRX = 0; // Receiver mode
I2caRegs.I2CMDR.bit.XA = 0; // 7-bit addressing mode
I2caRegs.I2CMDR.bit.RM = 0; // Nonrepeat mode
I2caRegs.I2CMDR.bit.DLB = 0; // Digital loopback mode is disabled
I2caRegs.I2CMDR.bit.IRS = 1; // The I2C module is enabled
I2caRegs.I2CMDR.bit.STB = 0; // The I2C module is not in the START byte mode
I2caRegs.I2CMDR.bit.FDF = 0; // Free data format mode is disabled
I2caRegs.I2CMDR.bit.BC = 0; // 8 bits per data byte
oledInit();
oledClear();
oledGotoYX( 0, 0 );
oledPrint( "PWM" );
}
//-----------------------------------------------------------------------------
int16_t i2c1Xfer(
Uint8 address,
Uint8* wdata, int wsize,
Uint8* rdata, int rsize )
{
Uint16 i;
// I2caRegs.I2CMDR.bit.IRS = 1;
// // Make sure I2C is not busy and has stopped
// while (I2caRegs.I2CSTR.bit.BB == 1); // busy loop
// I2caRegs.I2CSTR.bit.SCD = 1; // Clear the SCD bit (stop condition bit)
// while(I2caRegs.I2CMDR.bit.STP == 1); // stop bit loop
I2caRegs.I2CSAR = address; // I2C slave address
// while (I2caRegs.I2CSTR.bit.BB == 1); // still busy?
I2caRegs.I2CCNT = wsize; // Setup number of bytes to send
for (i=0; i<wsize; i++)
{
// usDelay(1);
I2caRegs.I2CDXR = *(wdata+i);
}
I2caRegs.I2CMDR.all = 0x6E20; // Send the TX FIFO : 0110 1110 0010 0000
// I2caRegs.I2CMDR.all = 0x6620; // STT=1 : 0111 0110 0010 0000
// I2caRegs.I2CMDR.bit.NACKMOD = 0; // NACK mode bit
// I2caRegs.I2CMDR.bit.FREE = 1; // Run free I2C when suspended
// I2caRegs.I2CMDR.bit.STT = 1; // START condition bit
// I2caRegs.I2CMDR.bit.STP = 1; // STOP condition bit
// I2caRegs.I2CMDR.bit.MST = 1; // Master mode
// I2caRegs.I2CMDR.bit.TRX = 1; // Transmitter mode
// I2caRegs.I2CMDR.bit.XA = 0; // 7-bit addressing mode
// I2caRegs.I2CMDR.bit.RM = 0; // Nonrepeat mode
// I2caRegs.I2CMDR.bit.DLB = 0; // Digital loopback mode is disabled
// I2caRegs.I2CMDR.bit.IRS = 1; // The I2C module is enabled
// I2caRegs.I2CMDR.bit.STB = 0; // The I2C module is not in the START byte mode
// I2caRegs.I2CMDR.bit.FDF = 0; // Free data format mode is disabled
// I2caRegs.I2CMDR.bit.BC = 0; // 8 bits per data byte
// I2caRegs.I2CMDR.bit.STP = 1; // stop bit when CNT=0
// usDelay(1);
// while(!I2caRegs.I2CSTR.bit.SCD); // wait for STOP condition
return I2C_SUCCESS;
}
//-----------------------------------------------------------------------------
void oledCommand( Uint8 ch )
{
Uint8 bytes[2];
bytes[0] = SSD1308_Command_Mode;
bytes[1] = ch;
i2c1Xfer( SSD1308_Address, bytes, 2, NULL, 0 );
}
oledCommand(0xA7); //--SSD1308_Inverse_Display_Cmd : 0x80 0xA7
this order should give 0x3C as a write order (1bit shifted) then the 0x80 (cmd) then 0xA7
instead of that
I have a strange of a beginning with 8 bits clk, with 0 than the Stop than the addy in write mode, no first byte then the end byte??? and no stop bit
if I try to add the while it stops working..
Thanks for your help
