Quantcast
Channel: Forums - Recent Threads
Viewing all articles
Browse latest Browse all 262198

CCS/TMS320F28379D: C2000™ microcontrollers forum

$
0
0

Part Number:TMS320F28379D

Tool/software: Code Composer Studio

Hi. I am trying to communicate with magnetometer through I2C. I learned how to initialize I2C peripheral and some I2C standard functions used in example i2c_ex2_eeprom.c and i2c_ex1_loopback.c. Now I try to make my own I2C functions based on those examples to build up my sensor library. As I saw in example, to read and write to I2C, we follow this procedure (assumed all initializations have been done):

To write to I2C:

- set slave address

- set register address to be written

- put data ready to be sent 

- send start condition

- send stop condition

To read I2C

- set slave address

- set register address to be read

- send start condition

- wait for I2C_INTSRC_REG_ACCESS_RDY to be triggered and then, send stop condition inside ISR

- set number of bytes to be read

- read data using I2C_getData()

I follow this procedure and make some function as shown below. But I have some problem with read function ( write function seemed to be ok)

- I2C_INTSRC_REG_ACCESS_RDY was not triggered so stop condition could not be sent to end the setting up address process

- the program stuck in while(I2C_getStopConditionStatus(base)!=0). But it stuck in the second statement not the first one which I found weird since stop condition cant be sent inside ISR

Please give me some advice. Thanks in advance

void initI2C(uint32_t base)
{
    I2C_disableModule(base);
    // I2C configuration. Use a 400KHz I2C clock with a 33% duty cycle
    I2C_initMaster(base, DEVICE_SYSCLK_FREQ, 400000, I2C_DUTYCYCLE_33);
    I2C_setBitCount(base, I2C_BITCOUNT_8);
   // I2C_setSlaveAddress(base, slaveAddr);
    I2C_setEmulationMode(base,I2C_EMULATION_FREE_RUN);
    // enable stop condition and register-access-ready interrupts

    I2C_enableInterrupt(base,I2C_INT_STOP_CONDITION |
                        I2C_INT_REG_ACCESS_RDY);
    // FIFO configuration

    I2C_enableFIFO(base);
    I2C_clearInterruptStatus(base,I2C_INT_RXFF | I2C_INT_TXFF);
    I2C_enableModule(base);
}
int16_t i2cRead(uint32_t base, uint16_t slaveAddr,uint16_t regAddr,uint16_t *data,uint16_t data_length)
{
	uint16_t count;
	if(I2C_getStopConditionStatus(base))
	{
		return ERROR_STOP_NOT_READY;
	}

    I2C_setSlaveAddress(base, slaveAddr);
    I2C_setDataCount(base, 1);
    I2C_putData(base, regAddr);
    I2C_setConfig(base, I2C_MASTER_SEND_MODE);
    I2C_sendStartCondition(base);
 //   I2C_sendStopCondition(base);
    while(I2C_getStopConditionStatus(base)!=0);
    I2C_setDataCount(base,data_length);
    I2C_setConfig(base,I2C_MASTER_RECEIVE_MODE);
    I2C_sendStartCondition(base);
    I2C_sendStopCondition(base);
	while(I2C_getStopConditionStatus(base)!=0);   // this is where the program stuck
//	    while(data_ready_flag==0);
	    for(count=0;count<data_length;count++)
	    {
		//while(I2C_getRxFIFOStatus(base)==I2C_FIFO_RXEMPTY);
	        *(data+count) = I2C_getData(base);
	    }
	return SUCCESS;
}
int16_t i2cWrite(uint32_t base,uint16_t slaveAddr, uint16_t regAddr, uint16_t data)
{
	if(I2C_getStopConditionStatus(base))
	{
		return ERROR_STOP_NOT_READY;
	}
	I2C_setSlaveAddress(base, slaveAddr);
	if(I2C_isBusBusy(I2CB_BASE))
	    {
	        return(ERROR_BUS_BUSY);
	    }
	I2C_setDataCount(base,2);
	I2C_putData(base,regAddr);
	I2C_putData(base, data);
	I2C_setConfig(base,I2C_MASTER_SEND_MODE);
    I2C_sendStartCondition(base);
    I2C_sendStopCondition(base);
    return SUCCESS;
}
int16_t i2cWriteMulti(uint32_t base,uint16_t slaveAddr, uint16_t regAddr, uint16_t *data,uint16_t data_length)
{
	uint16_t i;
	if(I2C_getStopConditionStatus(base))
	{
		return ERROR_STOP_NOT_READY;
	}
	I2C_setSlaveAddress(base, slaveAddr);
	if(I2C_isBusBusy(I2CB_BASE))
	    {
	        return(ERROR_BUS_BUSY);
	    }
	I2C_setDataCount(base,data_length+1);
	I2C_putData(base,regAddr);
	for(i=0; i<data_length;i++)
	{
		I2C_putData(base, *(data+i));
	}
    I2C_setConfig(base,I2C_MASTER_SEND_MODE);
    I2C_sendStartCondition(base);
    I2C_sendStopCondition(base);
    return SUCCESS;

}
__interrupt void i2cISR()
{
    count++;
	intSource = I2C_getInterruptSource(I2CB_BASE);
	switch(intSource)
	{
	case I2C_INTSRC_STOP_CONDITION:
	{
	 
	}
	break;
	case I2C_INTSRC_REG_ACCESS_RDY:
	{
	    if((I2C_getStatus(I2CB_BASE)&I2C_STS_NO_ACK)!=0)
        {
            I2C_sendStopCondition(I2CB_BASE);
            I2C_clearStatus(I2CB_BASE, I2C_STS_NO_ACK);
        }
	}
	break;
	}
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP8);

}


Viewing all articles
Browse latest Browse all 262198

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>