Dear Estephania,
attached you'll find the code for the kma36 and I2C. I'm not able to send you the complete project.
Thank you for the information about further debug.
Regards
Lothar
#define I2C0_MASTER ((I2C_Type *) I2C0_BASE)
#define I2C0_MASTER_CLK_SRC (I2C0_CLK_SRC)
#define I2C0_BAUDRATE (100000)
#define KMA36_I2C_ADDRESS 0x59 /**< Linear Encoder Default Address */
#define KMA36_SLP (0x80)
#define KMA36_LIN (0x20)
#define KMA36_CNT (0x10)
#define KMA36_PWR (0x08)
#define KMA36_SPD (0x04)
#define KMA36_OVSC (0x03)
#define KMA36_OS2 (0x00)
#define KMA36_OS4 (0x01)
#define KMA36_OS8 (0x02)
#define KMA36_OS32 (0x03)
#define KMA36_MIN_RESOLUTION 1
#define KMA36_MAX_RESOLUTION 32768
typedef struct {
i2c_rtos_handle_t *handle; /**< I2C device the sensor is connected to */
uint8_t addr; /**< the slave address on the I2C bus */
bool initialized; /**< status eq. true if initialized */
} kma36_t;
typedef enum kma36_status_tag{
kma36_status_ok = 0,
kma36_status_i2c_transfer_error = -1,
kma36_status_crc_error = -2,
kma36_status_parameter_fault = -3,
kma36_status_dev_fault = -4,
kma36_status_init_fault = -5
}kma36_status_t;
typedef enum kma36_oversampling_tag{
kma36_oversampling_2 = 0,
kma36_oversampling_4 = 1,
kma36_oversampling_8 = 2,
kma36_oversampling_32 = 3
}kma36_oversampling_t;
static i2c_rtos_handle_t *i2c0_handle;
static kma36_t kma36_dev;
static uint16_t uint16_kma36_ma;
static uint32_t uint32_kma36_ilc;
static uint8_t uint8_kma36_kconf;
static uint16_t uint16_kma36_kres;
void BleApp_Init(void)
{
...
BOARD_InitI2C0();
i2c0_handle = i2c_rtos_init_master(I2C0_MASTER, I2C0_MASTER_CLK_SRC, I2C0_BAUDRATE);
...
memset(&kma36_dev, 0, sizeof(kma36_dev));
kma36_init(&kma36_dev, i2c0_handle, KMA36_I2C_ADDRESS);
kma36_set_enable_counter(&kma36_dev);
kma36_write_config(&kma36_dev);
kma36_set_enable_linear(&kma36_dev);
kma36_write_config(&kma36_dev);
kma36_set_resolution(&kma36_dev, 0x8000);
kma36_write_config(&kma36_dev);
kma36_set_accuracy(&kma36_dev, kma36_oversampling_2);
kma36_write_config(&kma36_dev);
...
}
void BOARD_InitI2C0(void)
{
CLOCK_EnableClock(kCLOCK_PortC);
/* PTC16, PTC19 configured as I2C0_SCL, I2C0_SDA */
const port_pin_config_t ptc16_pin_d5_config = {
kPORT_PullUp,
kPORT_SlowSlewRate,
kPORT_PassiveFilterDisable,
kPORT_LowDriveStrength,
kPORT_MuxAlt3,
};
PORT_SetPinConfig(I2C0_PORT, I2C0_SCL_PIN, &ptc16_pin_d5_config);
const port_pin_config_t ptc19_pin_c5_config = {
kPORT_PullUp,
kPORT_SlowSlewRate,
kPORT_PassiveFilterDisable,
kPORT_LowDriveStrength,
kPORT_MuxAlt3,
};
PORT_SetPinConfig(I2C0_PORT, I2C0_SDA_PIN, &ptc19_pin_c5_config);
}
i2c_rtos_handle_t *i2c_rtos_init_master(I2C_Type* dev, uint32_t clk_src,
uint32_t baudrate)
{
status_t status;
i2c_master_config_t masterConfig;
uint32_t sourceClock = 0;
I2C_MasterGetDefaultConfig(&masterConfig);
masterConfig.baudRate_Bps = baudrate;
sourceClock = CLOCK_GetFreq(clk_src);
if (dev == I2C0_MASTER){
if (i2c0_initialized == true) {
return NULL;
}
status = I2C_RTOS_Init(&handle_i2c0, dev, &masterConfig, sourceClock);
if (status == kStatus_Success) {
i2c0_initialized = true;
return &handle_i2c0;
} else {
return NULL;
}
}
else if (dev == I2C1_MASTER){
if (i2c1_initialized == true) {
return NULL;
}
status = I2C_RTOS_Init(&handle_i2c1, dev, &masterConfig, sourceClock);
if (status == kStatus_Success) {
i2c1_initialized = true;
return &handle_i2c1;
} else {
return NULL;
}
}
return NULL;
}
int8_t kma36_init(kma36_t* dev, i2c_rtos_handle_t* handle, uint8_t address)
{
int8_t int8_Stat = kma36_status_ok;
/* write device descriptor */
dev->handle = handle;
dev->addr = address;
if(dev->initialized == false) {
int8_Stat = kma36_read_regs(dev, kma36_register_read_kresel); // Read Magnetic angle, Incremental linear and Configuration register
if(int8_Stat == kma36_status_ok) {
dev->initialized = true;
}
else{
int8_Stat = kma36_status_i2c_transfer_error;
}
}
return int8_Stat;
}
int8_t kma36_set_enable_counter(kma36_t* dev)
{
int8_t int8_Stat = kma36_status_ok;
if(dev->handle != NULL) {
if(dev->initialized == true) {
uint8_kma36_kconf |= KMA36_CNT;
}
else {
int8_Stat = kma36_status_init_fault;
}
}
else {
int8_Stat = kma36_status_dev_fault;
}
return int8_Stat;
}
int8_t kma36_set_enable_linear(kma36_t* dev)
{
int8_t int8_Stat = kma36_status_ok;
if(dev->handle != NULL) {
if(dev->initialized == true) {
uint8_kma36_kconf |= KMA36_LIN;
}
else {
int8_Stat = kma36_status_init_fault;
}
}
else {
int8_Stat = kma36_status_dev_fault;
}
return int8_Stat;
}
int8_t kma36_set_resolution(kma36_t* dev, uint16_t uint16_Resolution)
{
int8_t int8_Stat = kma36_status_ok;
if(dev->handle != NULL) {
if(dev->initialized == true) {
if((uint16_Resolution >= KMA36_MIN_RESOLUTION) && (uint16_Resolution <= KMA36_MAX_RESOLUTION)) {
uint16_kma36_kres = uint16_Resolution;
}
else {
int8_Stat = kma36_status_parameter_fault;
}
}
else {
int8_Stat = kma36_status_init_fault;
}
}
else {
int8_Stat = kma36_status_dev_fault;
}
return int8_Stat;
}
int8_t kma36_set_accuracy(kma36_t* dev, kma36_oversampling_t os)
{
int8_t int8_Stat = kma36_status_ok;
if(dev->handle != NULL) {
if(dev->initialized == true) {
uint8_kma36_kconf &= ~KMA36_OVSC;
switch(os) {
case kma36_oversampling_2:
uint8_kma36_kconf |= KMA36_OS2;
break;
case kma36_oversampling_4:
uint8_kma36_kconf |= KMA36_OS4;
break;
case kma36_oversampling_8:
uint8_kma36_kconf |= KMA36_OS8;
break;
case kma36_oversampling_32:
uint8_kma36_kconf |= KMA36_OS32;
break;
default :
int8_Stat = kma36_status_parameter_fault;
break;
}
}
else {
int8_Stat = kma36_status_init_fault;
}
}
else {
int8_Stat = kma36_status_dev_fault;
}
return int8_Stat;
}
int8_t kma36_write_config(kma36_t* dev)
{
int8_t int8_Stat = kma36_status_ok;
if(dev->handle != NULL) {
if(dev->initialized == true) {
int8_Stat = kma36_write_regs(dev);
}
else {
int8_Stat = kma36_status_init_fault;
}
}
else {
int8_Stat = kma36_status_dev_fault;
}
return int8_Stat;
}
uint8_t kma36_compute_crc(uint8_t* write_regs)
{
uint8_t uint8_Result;
uint8_Result = write_regs[0] + write_regs[1] + write_regs[2];
uint8_Result = 0xFF - uint8_Result + 0x01;
return uint8_Result;
}
int8_t kma36_write_regs(kma36_t* dev)
{
int8_t int8_Stat = kma36_status_ok;
uint8_t uint8_Tx_Buf[4];
if(dev->handle != NULL) {
if(dev->initialized == true) {
uint8_Tx_Buf[0] = uint8_kma36_kconf;
uint8_Tx_Buf[1] = (uint8_t)(uint16_kma36_kres >> 8);
uint8_Tx_Buf[2] = (uint8_t)(uint16_kma36_kres & 0xFF);
uint8_Tx_Buf[3] = kma36_compute_crc(uint8_Tx_Buf);
if (i2c_rtos_write_regs_no_subaddress(dev->handle, dev->addr, (uint8_t*)uint8_Tx_Buf, 4) != 4) {
int8_Stat = kma36_status_i2c_transfer_error;
}
}
else {
int8_Stat = kma36_status_init_fault;
}
}
else {
int8_Stat = kma36_status_dev_fault;
}
return int8_Stat;
}
int i2c_rtos_write_regs_no_subaddress(i2c_rtos_handle_t *handle, uint8_t address, uint8_t *data, int length)
{
int8_t int8_Retval = 0;
status_t status;
memset(&transfer, 0, sizeof(transfer));
transfer.slaveAddress = address;
transfer.direction = kI2C_Write;
transfer.subaddress = 0;
transfer.subaddressSize = 0;
transfer.data = (uint8_t*)data;
transfer.dataSize = length;
transfer.flags = kI2C_TransferDefaultFlag;
status = I2C_RTOS_Transfer(handle, &transfer);
if (status == kStatus_Success) {
int8_Retval = length;
}
return int8_Retval;
}