环境
- 系统:Windows 10
- SDK:simplelink_cc13x2_26x2_sdk_4_30_00_54
- IDE:Code Composer Studio, Version: 10.1.1.00004
- 例程:simple_peripheral_oad_offchip_CC26X2R1_LAUNCHXL_tirtos_ccs (已删除不必要的代码,请看:删除simple_peripheral_oad_offchip工程多余的代码)
1. 添加I2C
添加1个I2C,配置好IO,我要驱动的是AT24CXX芯片,其他选项默认就可以。
2. I2C代码
CONFIG_I2C_0 这个宏是syscfg文件生成的,在 ti_drivers_config.h 文件。
#include <ti/drivers/I2C.h>
#include <ti/sysbios/knl/Task.h>
#include "ti_drivers_config.h"
#include "user/drivers/iic.h"
static I2C_Handle i2cHandle;
static I2C_Params i2cParams;
void iic_init(I2C_BitRate bitRate)
{
I2C_init();
I2C_Params_init(&i2cParams);
i2cParams.bitRate = bitRate;
i2cParams.transferMode = I2C_MODE_BLOCKING;
i2cHandle = I2C_open(CONFIG_I2C_0, &i2cParams);
}
bool iic_write_bytes(uint8_t slaveaddr, uint8_t len, uint8_t *buf)
{
I2C_Transaction i2cTransaction;
i2cTransaction.writeBuf = buf;
i2cTransaction.writeCount = len;
i2cTransaction.readBuf = buf;
i2cTransaction.readCount = 0;
i2cTransaction.slaveAddress = slaveaddr;
return I2C_transfer(i2cHandle, &i2cTransaction);
}
bool iic_read_bytes(uint8_t slaveaddr, uint8_t len, uint8_t *buf)
{
I2C_Transaction i2cTransaction;
i2cTransaction.writeBuf = buf;
i2cTransaction.writeCount = 0;
i2cTransaction.readBuf = buf;
i2cTransaction.readCount = len;
i2cTransaction.slaveAddress = slaveaddr;
return I2C_transfer(i2cHandle, &i2cTransaction);
}
3. AT24C代码
#include "user/hal/hal_at24cxx.h"
#include <ti/sysbios/knl/Task.h>
#define HAL_AT24CXX_ADDR 0xA0
#define HAL_AT24CXX_DELAY(x) Task_sleep(x)
void hal_at24cxx_init(void)
{
iic_init(I2C_400kHz);
}
bool hal_at24cxx_read_bytes(uint8_t addr, uint8_t len, uint8_t *data)
{
//this code can read less than 256 bytes data
uint8_t pageAddr, offset;
pageAddr = (HAL_AT24CXX_ADDR>>1) + addr/256;
offset = addr % 256;
if(iic_write_bytes(pageAddr, 1, &offset))
return iic_read_bytes(pageAddr, len, data);
return false;
}
bool hal_at24cxx_write_bytes(uint8_t addr, uint8_t length, uint8_t *data)
{
uint8_t cnt=0, pageAddr,offset, len = 0;
uint8_t txBuf[10] = {0};
while(cnt < length)
{
pageAddr = (HAL_AT24CXX_ADDR>>1) + (addr+cnt)/256;
offset = (addr+cnt) % 256;
txBuf[0] = offset;
len = 8 - offset%8;
memcpy(&txBuf[1], &data[cnt], len);
if(!iic_write_bytes(pageAddr, len + 1, txBuf))
return false;
cnt += len;
HAL_AT24CXX_DELAY(500); // the delay is necessary
}
return true;
}