예제 #1
1
uint32_t I2CWriteSingle(uint32_t i2c_base, uint8_t address, uint8_t reg, uint8_t data) {

	// Set slave register to be written
	while(I2CMasterBusy(i2c_base));
	I2CMasterSlaveAddrSet(i2c_base, address, 0);
	I2CMasterDataPut(i2c_base, reg);
	I2CMasterControl(i2c_base, I2C_MASTER_CMD_BURST_SEND_START);
	while(I2CMasterBusy(i2c_base));

	// Check for errors
	if (I2CMasterErr(i2c_base) != I2C_MASTER_ERR_NONE) return 0;

	// Write data
	I2CMasterDataPut(i2c_base, data);
	I2CMasterControl(i2c_base, I2C_MASTER_CMD_BURST_SEND_CONT);
	while(I2CMasterBusy(i2c_base));

	// Check for errors
	if (I2CMasterErr(i2c_base) != I2C_MASTER_ERR_NONE) return 0;

	// End transmission
	I2CMasterControl(i2c_base, I2C_MASTER_CMD_BURST_SEND_FINISH);
	while(I2CMasterBusy(i2c_base));

	// Check for errors
	if (I2CMasterErr(i2c_base) != I2C_MASTER_ERR_NONE) return 0;

	return 1;
}
예제 #2
0
void i2c_rx_multi(unsigned char SlaveAddr, unsigned char dest, unsigned char num_bytes, unsigned long *data)
{
    unsigned int i=0;
    
    // Set the address
    I2CMasterSlaveAddrSet( I2C1_MASTER_BASE, SlaveAddr, I2C_SEND );
    I2CMasterDataPut( I2C1_MASTER_BASE, dest );
    I2CMasterControl( I2C1_MASTER_BASE, I2C_MASTER_CMD_SINGLE_SEND );
    while (I2CMasterBusy( I2C1_MASTER_BASE ));
    
    // Set the address again to tell the device to start sending data
    I2CMasterSlaveAddrSet( I2C1_MASTER_BASE, SlaveAddr, I2C_RECEIVE );
    
    I2CMasterControl( I2C1_MASTER_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START );
    while(I2CMasterBusy( I2C1_MASTER_BASE ));
    *data++ = I2CMasterDataGet(I2C1_MASTER_BASE);
        
    while(i++ < (num_bytes-2))
    {
        I2CMasterControl( I2C1_MASTER_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT );
        while(I2CMasterBusy( I2C1_MASTER_BASE ));
        *data++ = I2CMasterDataGet(I2C1_MASTER_BASE);
    }
    
    I2CMasterControl( I2C1_MASTER_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH );
    while(I2CMasterBusy( I2C1_MASTER_BASE ));
    *data++ = I2CMasterDataGet(I2C1_MASTER_BASE);
}
예제 #3
0
uint32_t I2CReadSingle(uint32_t i2c_base, uint8_t address, uint8_t reg) {
	uint32_t data = 0;

	// Set slave register to be read
	while(I2CMasterBusy(i2c_base));
	I2CMasterSlaveAddrSet(i2c_base, address, 0);
	I2CMasterDataPut(i2c_base, reg);
	I2CMasterControl(i2c_base, I2C_MASTER_CMD_SINGLE_SEND);
	while(I2CMasterBusy(i2c_base));

	// Check for errors
	if (I2CMasterErr(i2c_base) != I2C_MASTER_ERR_NONE) return 0;

	// Request for register data
	I2CMasterSlaveAddrSet(i2c_base, address, 1);
	I2CMasterControl(i2c_base, I2C_MASTER_CMD_SINGLE_RECEIVE);
	while(I2CMasterBusy(i2c_base));

	// Check for errors
	if (I2CMasterErr(i2c_base) != I2C_MASTER_ERR_NONE) return 0;

	// Read received data
	data = I2CMasterDataGet(i2c_base);

	return data;
}
예제 #4
0
void I2C_Write0(uint16_t device_address, uint16_t device_register, uint8_t device_data)
{
   //specify that we want to communicate to device address with an intended write to bus
   I2CMasterSlaveAddrSet(I2C0_BASE, device_address, false);

   //register to be read
   I2CMasterDataPut(I2C0_BASE, device_register);

   //send control byte and register address byte to slave device
   I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START);

   //wait for MCU to finish transaction
   while(I2CMasterBusy(I2C0_BASE));

   I2CMasterSlaveAddrSet(I2C0_BASE, device_address, true);

   //specify data to be written to the above mentioned device_register
   I2CMasterDataPut(I2C0_BASE, device_data);

   //wait while checking for MCU to complete the transaction
   I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);

   //wait for MCU & device to complete transaction
   while(I2CMasterBusy(I2C0_BASE));
}
예제 #5
0
uint32_t I2C_Read0(uint16_t device_address, uint16_t device_register)
{
   //specify that we want to communicate to device address with an intended write to bus
   I2CMasterSlaveAddrSet(I2C0_BASE, device_address, false);

   //the register to be read
   I2CMasterDataPut(I2C0_BASE, device_register);

   //send control byte and register address byte to slave device
   I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND);

   //wait for MCU to complete send transaction
   while(I2CMasterBusy(I2C0_BASE));

   //read from the specified slave device
   I2CMasterSlaveAddrSet(I2C0_BASE, device_address, true);

   //send control byte and read from the register from the MCU
   I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);

   //wait while checking for MCU to complete the transaction
   while(I2CMasterBusy(I2C0_BASE));

   //Get the data from the MCU register and return to caller
   return( (uint32_t)I2CMasterDataGet(I2C0_BASE));
 }
예제 #6
0
uint8_t TwoWire::sendTxData(unsigned long cmd, uint8_t data) {
    while(I2CMasterBusy(MASTER_BASE));
    I2CMasterDataPut(MASTER_BASE, data);

    HWREG(MASTER_BASE + I2C_O_MCS) = cmd;
    while(I2CMasterBusy(MASTER_BASE));
    uint8_t error = I2CMasterErr(MASTER_BASE);
    if (error != I2C_MASTER_ERR_NONE)
          I2CMasterControl(MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_ERROR_STOP);
    return(getError(error));
}
예제 #7
0
void i2c_tx_single(unsigned char SlaveAddr, unsigned char dest, unsigned char data)
{
    I2CMasterSlaveAddrSet( I2C1_MASTER_BASE, SlaveAddr, I2C_SEND );
    
    I2CMasterDataPut( I2C1_MASTER_BASE, dest );
    I2CMasterControl( I2C1_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_START );
    while(I2CMasterBusy(I2C1_MASTER_BASE));
    
    I2CMasterDataPut( I2C1_MASTER_BASE, data );
    I2CMasterControl( I2C1_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH );
    while(I2CMasterBusy(I2C1_MASTER_BASE));
}
예제 #8
0
파일: main.c 프로젝트: arduic/GitHub
//This will setup the com for a device, declare the regiester to write to and then write to that regiester
//Note I2C waits for a response bit before continuing. If there is no device on the other end the masterbusy loop will NEVER exit
void I2CTransmit(unsigned char device, unsigned char regiester, unsigned char value){
	I2CMasterSlaveAddrSet(I2C1_MASTER_BASE, device, false);	//Set Device to transmit to

	I2CMasterDataPut(I2C1_MASTER_BASE,regiester);	//Put on regiester to prep writting
	I2CMasterControl(I2C1_MASTER_BASE,I2C_MASTER_CMD_BURST_SEND_START);	//Send start bit and the first thing
	while(I2CMasterBusy(I2C1_MASTER_BASE));	//Wait till data sent

	I2CMasterDataPut(I2C1_MASTER_BASE,value);	//Put more data on
	I2CMasterControl(I2C1_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);	//Send data and finish bit
	while(I2CMasterBusy(I2C1_MASTER_BASE));	//Wait till done


}
예제 #9
0
unsigned long i2c_rx_single(unsigned char SlaveAddr, unsigned char dest)
{
    I2CMasterSlaveAddrSet( I2C1_MASTER_BASE, SlaveAddr, I2C_SEND );
    I2CMasterDataPut( I2C1_MASTER_BASE, dest );
    I2CMasterControl( I2C1_MASTER_BASE, I2C_MASTER_CMD_SINGLE_SEND );
    while (I2CMasterBusy( I2C1_MASTER_BASE ));
    
    I2CMasterSlaveAddrSet( I2C1_MASTER_BASE, SlaveAddr, I2C_RECEIVE );
    I2CMasterControl( I2C1_MASTER_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE );
    while(I2CMasterBusy( I2C1_MASTER_BASE ));
    
    return I2CMasterDataGet(I2C1_MASTER_BASE);
}
예제 #10
0
//*****************************************************************************
//
// Reads a single gyro register.  This routine is blocking.
//
// \param ui8RegisterAddress is the register address
// \return read data
//
//*****************************************************************************
uint8_t
Accel_RegRead(uint8_t ui8RegisterAddress)
{
    uint8_t ui8Data = 0;

    if (VERBOSE) UARTprintf("GryroRegRead(0x%x)\n", ui8RegisterAddress);

    // Set the slave device address for WRITE
    //   false = this I2C Master is initiating a writes to the slave.
    //   true  = this I2C Master is initiating reads from the slave.
    I2CMasterSlaveAddrSet(I2C1_BASE, ACCEL_SLAVE_ADDRESS, false);

    //
    // Transaction #1: Send the register address
    //

    // Set the Gyro Register address to write
    I2CMasterDataPut(I2C1_BASE, ui8RegisterAddress);

    // Start, send device address, write one byte (register address), and end the transaction
    I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_SINGLE_SEND);

    // Wait for completion
    while(I2CMasterBusy(I2C1_BASE))
    {
    	//spin wait
    }
    //TODO: Check I2CMasterErr(I2C1_BASE)

    //
    // Transaction #2: Read the register data
    //

    // Set the slave device address for READ
    //   false = this I2C Master is initiating a writes to the slave.
    //   true  = this I2C Master is initiating reads from the slave.
    I2CMasterSlaveAddrSet(I2C1_BASE, ACCEL_SLAVE_ADDRESS, true);

    // Start, send device address, read one byte (register data), and end the transaction
    I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);

    // Wait for completion
    while(I2CMasterBusy(I2C1_BASE))
    {
        //spin wait
    }
    //TODO: Check I2CMasterErr(I2C1_BASE)

    ui8Data = I2CMasterDataGet(I2C1_BASE);
    return ui8Data;
}
예제 #11
0
unsigned long byteAccelRead(int reg)
{
		short temp;
		I2CMasterSlaveAddrSet(I2C_MASTER_BASE, 0x1D, false);
		I2CMasterDataPut(I2C_MASTER_BASE, reg);
		I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_START);
		while(I2CMasterBusy(I2C_MASTER_BASE));
		I2CMasterSlaveAddrSet(I2C_MASTER_BASE, 0x1D, true);
		I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
		while(I2CMasterBusy(I2C_MASTER_BASE));
		return I2CMasterDataGet(I2C_MASTER_BASE);
	

	
}
예제 #12
0
void accelWrite (int reg,char data)
{
		// Sets the slave address
		I2CMasterSlaveAddrSet(I2C_MASTER_BASE, 0x1D, false);
		// Sends the register we want
		I2CMasterDataPut(I2C_MASTER_BASE, reg);
		I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_START);
		while(I2CMasterBusy(I2C_MASTER_BASE));
		


		// Set the register value
		I2CMasterDataPut(I2C_MASTER_BASE, data);
		I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
		while(I2CMasterBusy(I2C_MASTER_BASE));
}
예제 #13
0
uint32_t i2c_read_bytes(uint8_t address, uint8_t* buffer, uint32_t length) {
    uint32_t future = I2C_MAX_DELAY_US;
    
    // Receive operation
    I2CMasterSlaveAddrSet(address, true);

    // Multiple receive operation
    I2CMasterControl(I2C_MASTER_CMD_BURST_RECEIVE_START);

    // Calculate timeout
    future += board_timer_get();

    // Iterate overall all bytes
    while (length) {
        // Wait until complete or timeout
        while (I2CMasterBusy()) {
            // Update timeout status and return if expired
            if (board_timer_expired(future)) return length;
        }
        
        // Read data from I2C
        *buffer++ = I2CMasterDataGet();
        length--;

        // Check if it's the last byte
        if (length == 1) I2CMasterControl(I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
        else             I2CMasterControl(I2C_MASTER_CMD_BURST_RECEIVE_CONT);
    }
    
    // Return bytes read
    return length;
}
예제 #14
0
unsigned long I2CController::waitFinish(uint32_t timeout_ms)
{
	unsigned long ret;

	if (_interruptsEnabled) {
		if (_interruptSemaphore.take(timeout_ms)) {
			return I2CMasterErr(_base);
		} else {
			return 0xFFFFFFFF; // timeout;
		}
	} else {
		uint32_t timeout_time = Task::getTime() + timeout_ms;
		while (I2CMasterBusy(_base)) {
			ret = I2CMasterErr(_base);
			if (ret != I2C_MASTER_ERR_NONE) {
				return ret;
			}
			if ( (timeout_ms!=0xFFFFFFFF) && (Task::getTime() > timeout_time) ) {
				return 0xFFFFFFFF; // timeout;
			}
			Task::yield();
		}
		return I2CMasterErr(_base);
	}
}
예제 #15
0
//*****************************************************************************
// Reads one byte of data over a I2C bus.  
//
// Paramters:
//    baseAddr:  The base address of the I2C peripheral that is being
//                configured
//    data:      The data read by the transaction.
//    mcs:       Sets master control register of the I2C peripheral. Since a
//               data transaction can consist of multiple bytes, the value
//               of mcs is used to determine when start and stop bits are 
//               generated.
//
// Examples:
//    * Sending control word (i2c address) + read 1st byte of data. This
//    * assumes that additional bytes be read after this byte.  This
//    * would be used for reading multiple bytes at consecutive addresses
//    * in the slave address.  
//    i2cGetByte(I2C0_BASE, byte, I2C_MCS_START | I2C_MCS_RUN);
//
//    * Reading a byte in the middle of a multi-byte operation. (> 2 bytes)
//    i2cGetByte(I2C0_BASE, byte, I2C_MCS_RUN);
//
//    * Reading final byte of data in a multi-byte read 
//    i2cGetByte(I2C0_BASE, byte, I2C_MCS_RUN | I2C_MCS_STOP);
//
//    * Sending control word (i2c address) + reading a single byte read.
//    i2cGetByte(I2C0_BASE, byte, I2C_MCS_START | I2C_MCS_RUN | I2C_MCS_STOP);
//
// Return Value:
//    Returns I2C_OK if the base address is a valid and the data was 
//    transmitted sucessfully.
//*****************************************************************************
i2c_status_t i2cGetByte(
  uint32_t baseAddr, 
  uint8_t *data, 
  uint8_t mcs
)
{
  I2C0_Type *myI2C;
  
  if( i2cVerifyBaseAddr(baseAddr) == false)
  {
    return I2C_INVALID_BASE;
  }
  
 myI2C = (I2C0_Type *) baseAddr;
  
  // Start the transaction
  myI2C->MCS = mcs;
  
  // Wait for the device to be free
  while ( I2CMasterBusy(baseAddr)) {};
  
  // Check for error conditions
  if ( myI2C->MCS & I2C_MCS_ERROR  )
  {
    myI2C->MCS = I2C_MCS_STOP;
    return I2C_BUS_ERROR;
  }
  else
  {
    *data = myI2C->MDR;
    return I2C_OK;
  }
}
예제 #16
0
파일: main.c 프로젝트: arduic/GitHub
//Read from device using address and put the read values into buff. num=num of bytes to read
void I2CRead(unsigned char device, unsigned char regiester, unsigned char num, unsigned long *buff){
	//All commented code could likely be delted currently saving for record / emergency
	/*I2CMasterSlaveAddrSet(I2C1_MASTER_BASE, device, false);	//Set Device to transmit to

	I2CMasterDataPut(I2C1_MASTER_BASE,regiester);	//Put on regiester to prep writting
	I2CMasterControl(I2C1_MASTER_BASE,I2C_MASTER_CMD_SINGLE_SEND);
	//while(I2CMasterBusBusy(I2C1_MASTER_BASE));	//Wait till data sent
	while(I2CMasterBusy(I2C1_MASTER_BASE));		//this is good

	short i=0;
	for (i=0; i<num; i++){
		I2CMasterSlaveAddrSet(I2C1_MASTER_BASE, device, true);	//Set device to RECIEVE FROM
		/*I2CMasterDataPut(I2C1_MASTER_BASE,regiester+i);	//Put on regiester to prep writting
		I2CMasterControl(I2C1_MASTER_BASE,I2C_MASTER_CMD_SINGLE_SEND);
		//while(I2CMasterBusBusy(I2C1_MASTER_BASE));	//Wait till data sent
		while(I2CMasterBusy(I2C1_MASTER_BASE));
	 */
	/*if(i==0){
			I2CMasterControl(I2C1_MASTER_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);
		}else if(i==(num-1)){
			I2CMasterControl(I2C1_MASTER_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
		}else{
			I2CMasterControl(I2C1_MASTER_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT);
		}
		//while(I2CMasterIntStatus(I2C1_MASTER_BASE, false) == 0);
		while(I2CMasterBusy(I2C1_MASTER_BASE));
		buff[i] = I2CMasterDataGet(I2C1_MASTER_BASE);
		//I2CMasterIntClear(I2C1_MASTER_BASE);
	}
	//buff[0]=0x02;
	 */
	short i=0;	//Initalize i because CCS doesn't like initalizing inside for loop :P
	for(i=0; i<num; i++){
		I2CMasterSlaveAddrSet(I2C1_MASTER_BASE, device, false);	//Set device to write to
		I2CMasterDataPut(I2C1_MASTER_BASE,regiester+i);	//Put on regiester to prep writting
		I2CMasterControl(I2C1_MASTER_BASE,I2C_MASTER_CMD_SINGLE_SEND);	//Make a single send there is no bursting through
		while(I2CMasterBusy(I2C1_MASTER_BASE));		//wait for the transmission to end via checking the master's state NOT THE BUS

		I2CMasterSlaveAddrSet(I2C1_MASTER_BASE, device, true);	//Set device to RECIEVE FROM
		I2CMasterControl(I2C1_MASTER_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);	//Set a single read because it will only return this address
		while(I2CMasterBusy(I2C1_MASTER_BASE));		//Wait for the master to stop recieving data

		buff[i] = I2CMasterDataGet(I2C1_MASTER_BASE);	//Place the data recieved (that is in the FIFO) into the buffer to return
	}

}
예제 #17
0
uint8_t TwoWire::getRxData(unsigned long cmd) {

    if (currentState == IDLE) while(I2CMasterBusBusy(MASTER_BASE));
    HWREG(MASTER_BASE + I2C_O_MCS) = cmd;
    while(I2CMasterBusy(MASTER_BASE));
    uint8_t error = I2CMasterErr(MASTER_BASE);
    if (error != I2C_MASTER_ERR_NONE) {
        I2CMasterControl(MASTER_BASE, I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP);
    }
    else {
        while(I2CMasterBusy(MASTER_BASE));
        rxBuffer[rxWriteIndex] = I2CMasterDataGet(MASTER_BASE);
        rxWriteIndex = (rxWriteIndex + 1) % BUFFER_LENGTH;
    }
    return error;

}
예제 #18
0
uint32_t i2c_write_bytes(uint8_t address, uint8_t* buffer, uint32_t length) {
    uint32_t future = I2C_MAX_DELAY_US;
    
    // Transmit operation
    I2CMasterSlaveAddrSet(address, false);

    // Write byte to I2C buffer
    I2CMasterDataPut(*buffer++);
    length--;

    // Multiple transmit operation
    I2CMasterControl(I2C_MASTER_CMD_BURST_SEND_START);

    // Calculate timeout
    future += board_timer_get();

    // Wait until complete or timeout
    while (I2CMasterBusy()) {
        // Check timeout status and return if expired
        if (board_timer_expired(future)) return length;
    }

    // Iterate overall all bytes
    while (length) {
        // Write byte to I2C buffer
        I2CMasterDataPut(*buffer++);

        // Check if it's the last byte
        if (length == 1) I2CMasterControl(I2C_MASTER_CMD_BURST_SEND_FINISH);
        else             I2CMasterControl(I2C_MASTER_CMD_BURST_SEND_CONT);

        // Wait until complete or timeout
        while (I2CMasterBusy()) {
            // Check timeout status and return if expired
            if (board_timer_expired(future)) return length;
        }

        // Update the length
        length--;
    }
    
    // Return bytes written
    return length;
}
예제 #19
0
//*****************************************************************************
//
// Writes a single gyro register.  This routine is blocking.
//
// \param ui8RegisterAddress is the register address
// \param ui8Data is the data to write
//
//*****************************************************************************
void
Accel_RegWrite(uint8_t ui8RegisterAddress, uint8_t ui8Data)
{
    if (VERBOSE) UARTprintf("GryroWriteReg(0x%x, 0x%x)\n", ui8RegisterAddress, ui8Data);

    // Set the slave device address for WRITE
    //   false = this I2C Master is initiating a writes to the slave.
    //   true  = this I2C Master is initiating reads from the slave.
    I2CMasterSlaveAddrSet(I2C1_BASE, ACCEL_SLAVE_ADDRESS, false);

    //
    // Transaction #1: Send the register address
    //

    // Set the Gyro Register address to write
    I2CMasterDataPut(I2C1_BASE, ui8RegisterAddress);

    // Start, send device address, write one byte (register address)...
    I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_START);

    // Wait for completion
    while(I2CMasterBusy(I2C1_BASE))
    {
    	//spin wait
    }
    //TODO: Check I2CMasterErr(I2C1_BASE)

    //
    // Transaction #1 continued: Send the register data
    //

    //Set the Gyro Register address to write
    I2CMasterDataPut(I2C1_BASE, ui8Data);

    // ... write another byte (register data) and end the transaction
    I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);

    // Wait for completion
    while(I2CMasterBusy(I2C1_BASE))
    {
        //spin wait
    }
    //TODO: Check I2CMasterErr(I2C1_BASE)
}
예제 #20
0
uint32_t I2CReadMultiple(uint32_t i2c_base, uint8_t address, uint8_t reg, uint8_t *data, uint32_t size) {
	uint32_t byte_count;
	uint32_t master_command;

	// Set slave register to be read
	while(I2CMasterBusy(i2c_base));
	I2CMasterSlaveAddrSet(i2c_base, address, 0);
	I2CMasterDataPut(i2c_base, reg);
	I2CMasterControl(i2c_base, I2C_MASTER_CMD_SINGLE_SEND);
	while(I2CMasterBusy(i2c_base));

	// Check for errors
	if (I2CMasterErr(i2c_base) != I2C_MASTER_ERR_NONE) return 0;

	// Start burst read
	I2CMasterSlaveAddrSet(i2c_base, address, 1);
	master_command = I2C_MASTER_CMD_BURST_RECEIVE_START;

	for (byte_count = 0; byte_count < size; byte_count++) {

		// The second byte has to be read with CONT
		if (byte_count == 1) master_command = I2C_MASTER_CMD_BURST_RECEIVE_CONT;

		// The last byte has to be read with FINISH
		if (byte_count == size - 1) master_command = I2C_MASTER_CMD_BURST_RECEIVE_FINISH;

		// If only one byte, reconfigure to SINGLE
		if (size == 1) master_command = I2C_MASTER_CMD_SINGLE_RECEIVE;

		// Initiate read
		I2CMasterControl(i2c_base, master_command);

		// Wait for master operation
		while(I2CMasterBusy(i2c_base));

		// Check for errors
		if (I2CMasterErr(i2c_base) != I2C_MASTER_ERR_NONE) return 0;

		// Put data into array
		data[byte_count] = I2CMasterDataGet(i2c_base);
	}

	return byte_count;
}
예제 #21
0
uint32_t I2CWriteMultiple(uint32_t i2c_base, uint8_t address, uint8_t reg, uint8_t *data, uint32_t size) {
	uint32_t byte_count;
	uint32_t master_command;

	// Set slave register to be written
	while(I2CMasterBusy(i2c_base));
	I2CMasterSlaveAddrSet(i2c_base, address, 0);
	I2CMasterDataPut(i2c_base, reg);
	I2CMasterControl(i2c_base, I2C_MASTER_CMD_BURST_SEND_START);
	while(I2CMasterBusy(i2c_base));

	// Check for errors
	if (I2CMasterErr(i2c_base) != I2C_MASTER_ERR_NONE) return 0;

	// Start burst write
	master_command = I2C_MASTER_CMD_BURST_SEND_CONT;

	for (byte_count = 0; byte_count < size; byte_count++) {

		// The second byte has to be sent with CONT
		if (byte_count == 1) master_command = I2C_MASTER_CMD_BURST_SEND_CONT;

		// The last byte has to be sent with FINISH
		if (byte_count == size - 1) master_command = I2C_MASTER_CMD_BURST_SEND_FINISH;

		// If only one byte, reconfigure to SINGLE
		if (size == 1) master_command = I2C_MASTER_CMD_SINGLE_SEND;

		// Write byte
		I2CMasterDataPut(i2c_base, data[byte_count]);
		I2CMasterControl(i2c_base, master_command);

		// Wait for master operation
		while(I2CMasterBusy(i2c_base));

		// Check for errors
		if (I2CMasterErr(i2c_base) != I2C_MASTER_ERR_NONE) return 0;
	}

	return 1;
}
예제 #22
0
uint8_t TwoWire::endTransmission(uint8_t sendStop)
{
  uint8_t error = I2C_MASTER_ERR_NONE;

  if(TX_BUFFER_EMPTY) return 0;
  //Wait for any previous transaction to complete
  while(I2CMasterBusBusy(MASTER_BASE));
  while(I2CMasterBusy(MASTER_BASE));

  //Select which slave we are requesting data from
  //false indicates we are writing to the slave
  I2CMasterSlaveAddrSet(MASTER_BASE, txAddress, false);

  while(I2CMasterBusy(MASTER_BASE));
  unsigned long cmd = RUN_BIT | START_BIT;

  error = sendTxData(cmd,txBuffer[txReadIndex]);
  txReadIndex = (txReadIndex + 1) % BUFFER_LENGTH;
  if(error) return error;
  while(!TX_BUFFER_EMPTY) {
      error = sendTxData(RUN_BIT,txBuffer[txReadIndex]);
        txReadIndex = (txReadIndex + 1) % BUFFER_LENGTH;
      if(error) return getError(error);
  }

  if(sendStop) {
      while(I2CMasterBusy(MASTER_BASE));
      HWREG(MASTER_BASE + I2C_O_MCS) = STOP_BIT;
      while(I2CMasterBusy(MASTER_BASE));
      currentState = IDLE;
  }
  else {
      currentState = MASTER_TX;
  }

  // indicate that we are done transmitting
  transmitting = 0;
  return error;

}
예제 #23
0
//used to control the leds
void LED_CONTROL(int LED_NUMBER, int LED_COMMAND)
{

	data_handler(LED_NUMBER,LED_COMMAND);

	// Slave address of TCA6507 is 0x45 (binary 1001 101)
	// false=write / true=read
	I2CMasterSlaveAddrSet(I2C0_MASTER_BASE, 0x45, false);

// the for loop is there to make the code more compact and removes some redundant commands.
	int COUNTER;
		for (COUNTER=0;COUNTER!=5;COUNTER++)
		{

			if(COUNTER == 2)
			{
				//puts the command-byte in the dataput getting ready to sending it.
				I2CMasterDataPut(I2C0_MASTER_BASE, COMMAND_BYTE_INCREMENT);
				//starts sending the data.
				I2CMasterControl(I2C0_MASTER_BASE,I2C_MASTER_CMD_BURST_SEND_START);
			}
			else if(COUNTER == 3)
			{
				//gets the first led_current_setting containing the byte for select0 ready to transmitting.
				I2CMasterDataPut(I2C0_MASTER_BASE,led_current_setting[0] );
				//keeps sending data.
				I2CMasterControl(I2C0_MASTER_BASE,I2C_MASTER_CMD_BURST_SEND_CONT);
			}
			else if(COUNTER == 4)
			{
				//gets the second led_current_setting containing the byte for select1 ready to transmitting.
				I2CMasterDataPut(I2C0_MASTER_BASE,led_current_setting[1] );
				//keeps sending data.
				I2CMasterControl(I2C0_MASTER_BASE,I2C_MASTER_CMD_BURST_SEND_CONT);
			}
			else if(COUNTER == 5)
			{
				//gets the third led_current_setting containing the byte for select2 ready to transmitting.
				I2CMasterDataPut(I2C0_MASTER_BASE,led_current_setting[2] );
				//transmitting the final byte and a stop command.
				I2CMasterControl(I2C0_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH );
			}


			// Wait for I2C to finish.
			while(I2CMasterBusy(I2C0_MASTER_BASE));

			//a short delay.
			SysCtlDelay(80000);
		}

}
예제 #24
0
uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint8_t sendStop)
{
  uint8_t error = 0;
  uint8_t oldWriteIndex = rxWriteIndex;
  uint8_t spaceAvailable = (rxWriteIndex >= rxReadIndex) ?
         BUFFER_LENGTH - (rxWriteIndex - rxReadIndex) : (rxReadIndex - rxWriteIndex);

  if (quantity > spaceAvailable)
      quantity = spaceAvailable;
  if (!quantity) return 0;

  //Select which slave we are requesting data from
  //true indicates we are reading from the slave
  I2CMasterSlaveAddrSet(MASTER_BASE, address, true);

  unsigned long cmd = 0;

  if((quantity > 1) || !sendStop)
      cmd = RUN_BIT | START_BIT | ACK_BIT;
  else cmd = RUN_BIT | START_BIT | (sendStop << 2);

  error = getRxData(cmd);
  if(error) return 0;

  currentState = MASTER_RX;

  for (int i = 1; i < quantity; i++) {
      //since NACK is being sent on last byte, a consecutive burst read will
      //need to send a start condition
      if(i == (quantity - 1))
        cmd = RUN_BIT;
      else
        cmd = RUN_BIT | ACK_BIT;

      error = getRxData(cmd);
      if(error) return i;
  }

  if(sendStop) {
      HWREG(MASTER_BASE + I2C_O_MCS) = STOP_BIT;
      while(I2CMasterBusy(MASTER_BASE));
      currentState = IDLE;
  }

  uint8_t bytesWritten = (rxWriteIndex >= oldWriteIndex) ?
         BUFFER_LENGTH - (rxWriteIndex - oldWriteIndex) : (oldWriteIndex - rxWriteIndex);

  return(bytesWritten);

}
예제 #25
0
//used to control the brightness value.
void CHANGE_BRIGHTNESS_VALUES(int value0,int value1)
{
	// Slave address of TCA6507 is 0x45 (binary 1001 101)
		// false=write / true=read
		I2CMasterSlaveAddrSet(I2C0_MASTER_BASE, 0x45, false);

		int COUNTER;
		for (COUNTER=0;COUNTER!=4;COUNTER++)
		{

			//ensure that the user input value is a legal value if not it skips out of the function.
			if(value0||value1 > 15 )
			{
				COUNTER=4;
			}
			else if(value0||value1 <  1 )
			{
				COUNTER=4;
			}



			else if(COUNTER == 2)
			{
				//puts the command-byte in the dataput getting ready to sending it.
				I2CMasterDataPut(I2C0_MASTER_BASE, COMMAND_BYTE_MAXIMUM_INTENSITY);

				//starts sending the data.
				I2CMasterControl(I2C0_MASTER_BASE,I2C_MASTER_CMD_BURST_SEND_START);
			}
			else if(COUNTER == 3)
				{
					//value0 and value1 is send through the same byte where value0 is the first 4bit and value1 is the last 4bit.
					I2CMasterDataPut(I2C0_MASTER_BASE,NUMBER_HEX[value0]+(10*NUMBER_HEX[value1]));

					//transmitting the final byte and a stop command.
					I2CMasterControl(I2C0_MASTER_BASE,I2C_MASTER_CMD_BURST_SEND_FINISH );
				}


			// Wait for I2C to finish.
			while(I2CMasterBusy(I2C0_MASTER_BASE));

			//a short delay.
			SysCtlDelay(80000);

		}


}
예제 #26
0
/**
 * Verifies that a transmission from the master has completed successfully
 *
 * \param ui32base Base address of the I2C peripheral 
 *
 * \param burst Set to true if burst mode was used for the transmission
 *
 * \param receive Set to true if a receive transmission is to be verified
 * Set to false if a send transmission is to be verified
 *
 * \note Waits until a transmission is complete and then checks that no errors have occurred
 *
 * \note If an error occurs the I2C transmission is stopped, the error LED is lit and the
 * program enters an infinite loop to hold the state.
 **/
void twe_I2CMasterVerify(uint32_t ui32base, bool burst, bool receive) {
	while(I2CMasterBusy(ui32base)) {} // Wait until the transfer is complete
	//uint32_t errorStatus = I2CMasterErr(ui32Base);
	if(I2CMasterErr(ui32base) != I2C_MASTER_ERR_NONE) {

		// An error has occured
		if(burst && !receive) {
			I2CMasterControl(ui32base, I2C_MASTER_CMD_BURST_SEND_ERROR_STOP);
		}
		else if(burst && !receive) {
			I2CMasterControl(ui32base, I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP);
		}

		while(1) {} // Capture state
	}
}
예제 #27
0
unsigned long I2CController::waitFinish()
{
	unsigned long ret;

	while (I2CMasterBusy(_base)) {
		ret = I2CMasterErr(_base);
		if (ret != I2C_MASTER_ERR_NONE) {
			return ret;
		}
	}
	ret = I2CMasterErr(_base);
	if (ret != I2C_MASTER_ERR_NONE) {
		return ret;
	}
	return 0;
}
예제 #28
0
//*****************************************************************************
// Sends one byte of data over a I2C bus.  
//
// Paramters:
//    baseAddr:  The base address of the I2C peripheral that is being
//                configured
//    byte:      The next byte of the data transaction.
//    mcs:       Sets master control register of the I2C peripheral. Since a
//               data transaction can consist of multiple bytes, the value
//               of mcs is used to determine when start and stop bits are 
//               generated.
//
// Examples:
//    * Sending control word (i2c address) + write 1st byte of data. This
//    * assumes that additional bytes will follow in the transaction
//    i2cSendByte(I2C0_BASE, byte, I2C_MCS_START | I2C_MCS_RUN);
//
//    * Sending a byte in the middle of a multi-byte operation. (> 2 bytes)
//    i2cSendByte(I2C0_BASE, byte, I2C_MCS_RUN);
//
//    * Sending final byte  of data
//    i2cSendByte(I2C0_BASE, byte, I2C_MCS_RUN | I2C_MCS_STOP);
//
//    * Sending control word (i2c address) + a single byte transaction.
//    i2cSendByte(I2C0_BASE, byte, I2C_MCS_START | I2C_MCS_RUN | I2C_MCS_STOP);
//
// Return Value:
//    Returns I2C_OK if the base address is a valid and the data was 
//    transmitted sucessfully.
//*****************************************************************************
i2c_status_t i2cSendByte(
  uint32_t baseAddr, 
  uint8_t byte, 
  uint8_t mcs
)
{
  I2C0_Type *myI2C;
  
  if( i2cVerifyBaseAddr(baseAddr) == false)
  {
    return I2C_INVALID_BASE;
  }
  myI2C = (I2C0_Type *) baseAddr;
  
   // Write the upper address to the data register
  myI2C->MDR   = byte;
  
  // Start the transaction
  myI2C->MCS = mcs;
  
  // Wait for the device to be free
  while ( I2CMasterBusy(baseAddr)) {};
  
    // Check for error conditions
  if ( myI2C->MCS & (I2C_MCS_ERROR | I2C_MCS_ARBLST) )
  {
      return I2C_ARBLST;
  }
  else if ( myI2C->MCS & I2C_MCS_ERROR )
  {
    myI2C->MCS = I2C_MCS_STOP;
    return I2C_BUS_ERROR;
  }
  else if ( myI2C->MCS & I2C_MCS_DATACK )
  {
    return I2C_NO_ACK;
  }
  else
  {
    return I2C_OK;
  }
}
예제 #29
0
void I2CController::setup(GPIOPin sda, GPIOPin scl, speed_t speed)
{
	MutexGuard guard(&_lock);
	_sda = sda;
	_scl = scl;

	ROM_SysCtlPeripheralEnable(_periph);
	SysCtlPeripheralReset(_periph);

	_sda.enablePeripheral();
	if (_base == I2C0_MASTER_BASE) {
		_sda.mapAsI2C0SDA();
	}
	else if (_base == I2C1_MASTER_BASE) {
		_sda.mapAsI2C1SDA();
	}
	else {
		while(1) { /* we should never get here! */ }
	}
	_sda.configure(GPIOPin::I2C);

	_scl.enablePeripheral();
	if (_base == I2C0_MASTER_BASE) {
		_scl.mapAsI2C0SCL();
	}
	else if (_base == I2C1_MASTER_BASE) {
		_scl.mapAsI2C1SCL();
	}
	else {
		while(1) { /* we should never get here! */ }
	}
	_scl.configure(GPIOPin::I2CSCL);

	I2CMasterInitExpClk(_base, ROM_SysCtlClockGet(), (speed==speed_400kBit) ? 1 : 0);
	I2CMasterEnable(_base);

    // Do a dummy receive to make sure you don't get junk on the first receive.
    I2CMasterControl(_base, I2C_MASTER_CMD_SINGLE_RECEIVE);
	while(I2CMasterBusy(_base));

}
예제 #30
0
bool i2c_write_byte(uint8_t address, uint8_t byte) {   
    uint32_t future = I2C_MAX_DELAY_US;
    
    // Transmit operation
    I2CMasterSlaveAddrSet(address, false);

    // Write byte to I2C buffer
    I2CMasterDataPut(byte);

    // Single transmit operation
    I2CMasterControl(I2C_MASTER_CMD_SINGLE_SEND);
    
    // Calculate timeout
    future += board_timer_get();

    // Wait until complete or timeout
    while (I2CMasterBusy()) {
        // Check timeout status and return if expired
        if (board_timer_expired(future)) return false;
    }
    
    return true;
}