Skip to content

Commit 64edea6

Browse files
committed
Merge pull request #1817 from c1728p9/ksdk2_fixes
KSDK2 fixes
2 parents 34ea175 + 6815ce6 commit 64edea6

File tree

4 files changed

+23
-7
lines changed

4 files changed

+23
-7
lines changed

hal/targets/hal/TARGET_Freescale/TARGET_KSDK2_MCUS/TARGET_K22F/spi_api.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ int spi_master_write(spi_t *obj, int value) {
108108
// wait rx buffer full
109109
while (!spi_readable(obj));
110110
rx_data = DSPI_ReadData(spi_address[obj->instance]);
111-
DSPI_ClearStatusFlags(spi_address[obj->instance], kDSPI_RxFifoDrainRequestFlag);
111+
DSPI_ClearStatusFlags(spi_address[obj->instance], kDSPI_RxFifoDrainRequestFlag | kDSPI_EndOfQueueFlag);
112112
return rx_data & 0xffff;
113113
}
114114

hal/targets/hal/TARGET_Freescale/TARGET_KSDK2_MCUS/TARGET_K64F/spi_api.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ int spi_master_write(spi_t *obj, int value) {
108108
// wait rx buffer full
109109
while (!spi_readable(obj));
110110
rx_data = DSPI_ReadData(spi_address[obj->instance]);
111-
DSPI_ClearStatusFlags(spi_address[obj->instance], kDSPI_RxFifoDrainRequestFlag);
111+
DSPI_ClearStatusFlags(spi_address[obj->instance], kDSPI_RxFifoDrainRequestFlag | kDSPI_EndOfQueueFlag);
112112
return rx_data & 0xffff;
113113
}
114114

hal/targets/hal/TARGET_Freescale/TARGET_KSDK2_MCUS/api/i2c_api.c

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "peripheral_clock_defines.h"
2626
#include "PeripheralPins.h"
2727

28+
/* 7 bit IIC addr - R/W flag not included */
2829
static int i2c_address = 0;
2930
/* Array of I2C peripheral base address. */
3031
static I2C_Type *const i2c_addrs[] = I2C_BASE_PTRS;
@@ -35,6 +36,7 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
3536
uint32_t i2c_sda = pinmap_peripheral(sda, PinMap_I2C_SDA);
3637
uint32_t i2c_scl = pinmap_peripheral(scl, PinMap_I2C_SCL);
3738
obj->instance = pinmap_merge(i2c_sda, i2c_scl);
39+
obj->next_repeated_start = 0;
3840
MBED_ASSERT((int)obj->instance != NC);
3941

4042
i2c_master_config_t master_config;
@@ -77,6 +79,7 @@ int i2c_start(i2c_t *obj) {
7779

7880
int i2c_stop(i2c_t *obj) {
7981
if (I2C_MasterStop(i2c_addrs[obj->instance]) != kStatus_Success) {
82+
obj->next_repeated_start = 0;
8083
return 1;
8184
}
8285

@@ -94,12 +97,19 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
9497
I2C_Type *base = i2c_addrs[obj->instance];
9598
i2c_master_transfer_t master_xfer;
9699

97-
i2c_address = address;
100+
i2c_address = address >> 1;
98101
memset(&master_xfer, 0, sizeof(master_xfer));
99-
master_xfer.slaveAddress = address;
102+
master_xfer.slaveAddress = address >> 1;
100103
master_xfer.direction = kI2C_Read;
101104
master_xfer.data = (uint8_t *)data;
102105
master_xfer.dataSize = length;
106+
if (obj->next_repeated_start) {
107+
master_xfer.flags |= kI2C_TransferRepeatedStartFlag;
108+
}
109+
if (!stop) {
110+
master_xfer.flags |= kI2C_TransferNoStopFlag;
111+
}
112+
obj->next_repeated_start = master_xfer.flags & kI2C_TransferNoStopFlag ? 1 : 0;
103113

104114
/* The below function will issue a STOP signal at the end of the transfer.
105115
* This is required by the hardware in order to receive the last byte
@@ -116,12 +126,17 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
116126
i2c_master_transfer_t master_xfer;
117127

118128
memset(&master_xfer, 0, sizeof(master_xfer));
119-
master_xfer.slaveAddress = address;
129+
master_xfer.slaveAddress = address >> 1;
120130
master_xfer.direction = kI2C_Write;
121131
master_xfer.data = (uint8_t *)data;
122132
master_xfer.dataSize = length;
123-
if (!stop)
124-
master_xfer.flags = kI2C_TransferNoStopFlag;
133+
if (obj->next_repeated_start) {
134+
master_xfer.flags |= kI2C_TransferRepeatedStartFlag;
135+
}
136+
if (!stop) {
137+
master_xfer.flags |= kI2C_TransferNoStopFlag;
138+
}
139+
obj->next_repeated_start = master_xfer.flags & kI2C_TransferNoStopFlag ? 1 : 0;
125140

126141
if (I2C_MasterTransferBlocking(base, &master_xfer) != kStatus_Success) {
127142
return I2C_ERROR_NO_SLAVE;

hal/targets/hal/TARGET_Freescale/TARGET_KSDK2_MCUS/api/objects.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ struct analogin_s {
5050

5151
struct i2c_s {
5252
uint32_t instance;
53+
uint8_t next_repeated_start;
5354
};
5455

5556
struct spi_s {

0 commit comments

Comments
 (0)