TI中文支持网
TI专业的中文技术问题搜集分享网站

i2c arbitration lost

#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_gpio.h"
#include "inc/hw_i2c.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "driverlib/i2c.h"
#include "utils/uartstdio.h"

#define SLAVE_ADDRESS0x29//0x29=00101001  01010010=0x52
#define AMBIENT_TEMPERATURE0x05
#define DEVICE_ID_REGISTER0x12
#define MANUFACTURE_ID_REGISTER0x07
#define TCS34725_ENABLE0x00
#define TCS34725_ENABLE_PON0x01

uint16_t convertTemp(uint8_t, uint8_t);
void ConfigureUART(void);
void I2C_Init(void);
void I2C_Send(void);
uint16_t I2C_readMode(void);
uint16_t I2C_TempRead(void);
void Device_ID(uint8_t device_reg);
void Manufacture_ID(uint8_t manufacture_reg);
void Ambient_Temp(uint8_t ambient_temp_reg);

uint8_t readI2C0(uint16_t device_address, uint16_t device_register)
{//specify that we want to communicate to device address with an intended write to busI2CMasterSlaveAddrSet(I2C0_BASE, device_address, false);//the register to be readI2CMasterDataPut(I2C0_BASE, device_register);//send control byte and register address byte to slave deviceI2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND);//wait for MCU to complete send transactionwhile(I2CMasterBusy(I2C0_BASE));//read from the specified slave deviceI2CMasterSlaveAddrSet(I2C0_BASE, device_address, true);//send control byte and read from the register from the MCUI2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);//wait while checking for MCU to complete the transactionwhile(I2CMasterBusy(I2C0_BASE));//Get the data from the MCU register and return to callerreturn( I2CMasterDataGet(I2C0_BASE));
}

void writeI2C0(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 busI2CMasterSlaveAddrSet(I2C0_BASE, device_address, false);//register to be readI2CMasterDataPut(I2C0_BASE, device_register);//send control byte and register address byte to slave deviceI2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START);//wait for MCU to finish transactionwhile(I2CMasterBusy(I2C0_BASE));I2CMasterSlaveAddrSet(I2C0_BASE, device_address, true);//specify data to be written to the above mentioned device_registerI2CMasterDataPut(I2C0_BASE, device_data);//wait while checking for MCU to complete the transactionI2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);//wait for MCU & device to complete transactionwhile(I2CMasterBusy(I2C0_BASE));
}




int main(void)
{//FPULazyStackingEnable();uint8_t Device_id = 0;//uint16_t Manufacture_id = 0;// Set the clocking to run directly from the crystal//SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);// Enable the GPIO Port that is used for the on-board LEDs//SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);// Enable the GPIO Pins for the LEDs (PF1, PF2, PF3);//GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);// Initialize the UARTConfigureUART();SysCtlDelay(10000000);UARTprintf("Program Starting....\n\n");SysCtlDelay(50000000);UARTprintf("UART Initialized\n");SysCtlDelay(50000000);I2C_Init();SysCtlDelay(50000000);writeI2C0(SLAVE_ADDRESS,TCS34725_ENABLE,TCS34725_ENABLE_PON);UARTprintf("POWER ON!\n");SysCtlDelay(10000000);// I2C Send data to Slave Address - Device ID register - See MCP9808 datasheet//I2C_Send();//Device_ID(DEVICE_ID_REGISTER);//while(I2CMasterBusy(I2C0_BASE))//{//}Device_id = readI2C0(SLAVE_ADDRESS,DEVICE_ID_REGISTER);UARTprintf("Received Device ID from Slave: 0x%x\n\r", Device_id);SysCtlDelay(50000000);


}

void ConfigureUART(void)
{// Enable the GPIO Peripheral used by the UARTSysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);// Configure the GPIO Pins for UART modeGPIOPinConfigure(GPIO_PA0_U0RX);GPIOPinConfigure(GPIO_PA1_U0TX);GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);// Use the internal 16MHz oscillator as the UART Clock sourceUARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);// Initialize the UART for console I/O.UARTStdioConfig(0, 9600, 16000000);
}

void I2C_Init()
{// Enable I2C1 peripheralSysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);SysCtlPeripheralReset(SYSCTL_PERIPH_I2C0);// Enable GPIO Port B to be used for I2C0SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);GPIOPinConfigure(GPIO_PB2_I2C0SCL);GPIOPinConfigure(GPIO_PB3_I2C0SDA);// Configure the pin muxing for I2C1 functions on Port B2 and B3GPIOPinTypeI2CSCL(GPIO_PORTB_BASE, GPIO_PIN_2);GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_3);I2CMasterInitExpClk(I2C0_BASE, SysCtlClockGet(), false);// Set write modeUARTprintf("I2C Master init communication with Slave Address\n");SysCtlDelay(10000);UARTprintf("I2C Init complete!\n");SysCtlDelay(50000000);
}

void I2C_Send()
{// Specify Slave device address to write toI2CMasterSlaveAddrSet(I2C0_BASE, SLAVE_ADDRESS, false);UARTprintf("Master transmit to Slave address\n\n");
}

void Device_ID(uint8_t device_reg)
{// Send Register address on Slave deviceI2CMasterDataPut(I2C0_BASE, device_reg);UARTprintf("Writing to device id register on Slave address\n");// Initiate send of register address from Master to SlaveI2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND);UARTprintf("Device ID register sent to Slave address\n");
}



uint16_t I2C_readMode()
{uint8_t UpperByte = 0;uint8_t LowerByte = 0;uint16_t data = 0;// Set read modeI2CMasterSlaveAddrSet(I2C0_BASE, SLAVE_ADDRESS, true);// Get first byte from slave and ack for moreI2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);while(I2CMasterBusy(I2C0_BASE));UpperByte = I2CMasterDataGet(I2C0_BASE);// Get second byte from slave and nack for completeI2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);while(I2CMasterBusy(I2C0_BASE));LowerByte = I2CMasterDataGet(I2C0_BASE);// See MCP9808 Data Sheet for each of the register information requested fordata = UpperByte<<8|LowerByte;return data;
}
程序如上,不能正确的读出DEVICE_ID,在调试过程中发现ARBLST寄存器值为1,也就是发生了
arbitration lost的错误,请问是为什么呢

附:TCS34725颜色传感器资料

6735.TCS34725.pdf

xyz549040622:

你先加上拉试试,感觉程序出问题的可能性不大。

赞(0)
未经允许不得转载:TI中文支持网 » i2c arbitration lost
分享到: 更多 (0)

登录

注册