Skip to content

Commit d5e1c1c

Browse files
Fix some M480 I2C issues causing test shield test failures
1 parent 069ef73 commit d5e1c1c

File tree

3 files changed

+61
-53
lines changed

3 files changed

+61
-53
lines changed

targets/TARGET_NUVOTON/TARGET_M480/TARGET_NUMAKER_PFM_M487/PinNames.h

Lines changed: 32 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -43,29 +43,29 @@ typedef enum {
4343
PH_0 = NU_PINNAME(7, 0), PH_1, PH_2, PH_3, PH_4, PH_5, PH_6, PH_7, PH_8, PH_9, PH_10, PH_11,
4444

4545
// Arduino UNO naming
46-
A0 = PB_6,
47-
A1 = PB_7,
48-
A2 = PB_8,
49-
A3 = PB_9,
50-
A4 = PB_0,
51-
A5 = PB_1,
52-
53-
D0 = PB_2,
54-
D1 = PB_3,
55-
D2 = PC_9,
56-
D3 = PC_10,
57-
D4 = PC_11,
58-
D5 = PC_12,
59-
D6 = PE_4,
60-
D7 = PE_5,
61-
D8 = PA_5,
62-
D9 = PA_4,
63-
D10 = PA_3,
64-
D11 = PA_0,
65-
D12 = PA_1,
66-
D13 = PA_2,
67-
D14 = PG_1,
68-
D15 = PG_0,
46+
ARDUINO_UNO_A0 = PB_6,
47+
ARDUINO_UNO_A1 = PB_7,
48+
ARDUINO_UNO_A2 = PB_8,
49+
ARDUINO_UNO_A3 = PB_9,
50+
ARDUINO_UNO_A4 = PB_0,
51+
ARDUINO_UNO_A5 = PB_1,
52+
53+
ARDUINO_UNO_D0 = PB_2,
54+
ARDUINO_UNO_D1 = PB_3,
55+
ARDUINO_UNO_D2 = PC_9,
56+
ARDUINO_UNO_D3 = PC_10,
57+
ARDUINO_UNO_D4 = PC_11,
58+
ARDUINO_UNO_D5 = PC_12,
59+
ARDUINO_UNO_D6 = PE_4,
60+
ARDUINO_UNO_D7 = PE_5,
61+
ARDUINO_UNO_D8 = PA_5,
62+
ARDUINO_UNO_D9 = PA_4,
63+
ARDUINO_UNO_D10 = PA_3,
64+
ARDUINO_UNO_D11 = PA_0,
65+
ARDUINO_UNO_D12 = PA_1,
66+
ARDUINO_UNO_D13 = PA_2,
67+
ARDUINO_UNO_D14 = PG_1,
68+
ARDUINO_UNO_D15 = PG_0,
6969

7070
// Note: board-specific
7171
// UART naming
@@ -89,33 +89,21 @@ typedef enum {
8989
#else
9090
STDIO_UART_RX = CONSOLE_RX,
9191
#endif
92-
SERIAL_TX = D10,
93-
SERIAL_RX = D13,
94-
95-
// I2C naming
96-
I2C_SCL = D15,
97-
I2C_SDA = D14,
98-
99-
// LED naming
100-
LED_RED = PH_0,
101-
LED_YELLOW = PH_1,
102-
LED_GREEN = PH_2,
103-
LED1 = LED_RED,
104-
LED2 = LED_YELLOW,
105-
LED3 = LED_GREEN,
106-
LED4 = LED1, // No real LED. Just for passing ATS.
107-
108-
// Button naming
109-
SW2 = PG_15,
110-
SW3 = PF_11,
111-
BUTTON1 = SW2,
112-
BUTTON2 = SW3,
11392

11493
// Force PinName to 32-bit required by NU_PINNAME_BIND(...)
11594
FORCE_ENUM_PINNAME_32BIT = 0x7FFFFFFF,
11695

11796
} PinName;
11897

98+
// LEDs
99+
#define LED1 PH_0 // Red LED
100+
#define LED2 PH_1 // Yellow LED
101+
#define LED3 PH_2 // Green LED
102+
103+
// Buttons
104+
#define BUTTON1 PG_15
105+
#define BUTTON2 PF_11
106+
119107
#ifdef __cplusplus
120108
}
121109
#endif

targets/TARGET_NUVOTON/TARGET_M480/i2c_api.c

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ int i2c_slave_receive(i2c_t *obj)
313313

314314
int i2c_slave_read(i2c_t *obj, char *data, int length)
315315
{
316-
return i2c_do_tran(obj, data, length, 1, 1);
316+
return i2c_do_tran(obj, data, length, 1, 0);
317317
}
318318

319319
int i2c_slave_write(i2c_t *obj, const char *data, int length)
@@ -691,7 +691,6 @@ static void i2c_irq(i2c_t *obj)
691691
}
692692
obj->i2c.slaveaddr_state = ReadAddressed;
693693
break;
694-
//case 0xA0: // Slave Transmit Repeat Start or Stop
695694
case 0xC0: // Slave Transmit Data NACK
696695
case 0xC8: // Slave Transmit Last Data ACK
697696
obj->i2c.slaveaddr_state = NoData;
@@ -706,20 +705,26 @@ static void i2c_irq(i2c_t *obj)
706705
obj->i2c.slaveaddr_state = WriteAddressed;
707706
if ((obj->i2c.tran_ctrl & TRANCTRL_STARTED) && obj->i2c.tran_pos) {
708707
if (obj->i2c.tran_pos < obj->i2c.tran_end) {
708+
709+
// Did we receive any data? If so, receive it (if there is space in the buffer) and update tran_pos
709710
if (status == 0x80 || status == 0x88) {
710711
if (obj->i2c.tran_ctrl & TRANCTRL_RECVDATA) {
711-
*obj->i2c.tran_pos ++ = I2C_GET_DATA(i2c_base);
712+
if(obj->i2c.tran_pos < obj->i2c.tran_end)
713+
{
714+
*obj->i2c.tran_pos ++ = I2C_GET_DATA(i2c_base);
715+
}
716+
712717
obj->i2c.tran_ctrl &= ~TRANCTRL_RECVDATA;
713718
}
714719
}
715720

721+
// Did we NACK this byte, ending the transaction?
716722
if (status == 0x88) {
717723
obj->i2c.slaveaddr_state = NoData;
718724
i2c_fsm_reset(obj, I2C_CTL0_SI_Msk | I2C_CTL0_AA_Msk);
719-
} else if (obj->i2c.tran_pos == obj->i2c.tran_end) {
720-
obj->i2c.tran_ctrl &= ~TRANCTRL_STARTED;
721-
i2c_disable_int(obj);
722-
} else {
725+
}
726+
// Otherwise, tell the peripheral to receive the next byte
727+
else {
723728
uint32_t i2c_ctl = I2C_CTL0_SI_Msk | I2C_CTL0_AA_Msk;
724729
if ((obj->i2c.tran_end - obj->i2c.tran_pos) == 1 &&
725730
obj->i2c.tran_ctrl & TRANCTRL_NAKLASTDATA) {
@@ -738,7 +743,14 @@ static void i2c_irq(i2c_t *obj)
738743
i2c_disable_int(obj);
739744
}
740745
break;
741-
//case 0xA0: // Slave Receive Repeat Start or Stop
746+
747+
case 0xA0: // Slave Operation Complete
748+
// Master sent STOP condition, go back to idle state and end the operation
749+
obj->i2c.slaveaddr_state = NoData;
750+
i2c_fsm_reset(obj, I2C_CTL0_SI_Msk | I2C_CTL0_AA_Msk);
751+
obj->i2c.tran_ctrl &= ~TRANCTRL_STARTED;
752+
i2c_disable_int(obj);
753+
break;
742754

743755
// GC mode
744756
//case 0xA0: // GC mode Repeat Start or Stop
@@ -903,6 +915,7 @@ uint32_t i2c_irq_handler_asynch(i2c_t *obj)
903915
uint8_t *rx = (uint8_t *) obj->rx_buff.buffer;
904916
rx[obj->rx_buff.pos ++] = I2C_GET_DATA(((I2C_T *) NU_MODBASE(obj->i2c.i2c)));
905917
}
918+
// fall through
906919
case 0x40: // Master Receive Address ACK
907920
I2C_SET_CONTROL_REG(i2c_base, I2C_CTL0_SI_Msk | ((obj->rx_buff.pos != obj->rx_buff.length - 1) ? I2C_CTL0_AA_Msk : 0));
908921
break;
@@ -915,11 +928,15 @@ uint32_t i2c_irq_handler_asynch(i2c_t *obj)
915928
break;
916929

917930
case 0x58: // Master Receive Data NACK
931+
932+
// We get here after the last byte was transferred in an async read. Save it into the buffer
933+
// and end the transaction.
918934
if (obj->rx_buff.buffer && obj->rx_buff.pos < obj->rx_buff.length) {
919935
uint8_t *rx = (uint8_t *) obj->rx_buff.buffer;
920936
rx[obj->rx_buff.pos ++] = I2C_GET_DATA(((I2C_T *) NU_MODBASE(obj->i2c.i2c)));
921937
}
922-
I2C_SET_CONTROL_REG(i2c_base, I2C_CTL0_STA_Msk | I2C_CTL0_SI_Msk);
938+
I2C_SET_CONTROL_REG(i2c_base, I2C_CTL0_STO_Msk | I2C_CTL0_SI_Msk);
939+
event = I2C_EVENT_TRANSFER_COMPLETE;
923940
break;
924941

925942
case 0x00: // Bus error

targets/targets.json5

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8241,6 +8241,9 @@ mode is recommended for target MCUs with small amounts of flash and RAM.",
82418241
"spim-ccm-enable": 1,
82428242
"network-default-interface-type": "ETHERNET"
82438243
},
8244+
"supported_form_factors": [
8245+
"ARDUINO_UNO"
8246+
],
82448247
"image_url": "https://os.mbed.com/media/cache/platforms/NuMaker-PFM-M487.png.250x250_q85.png"
82458248
},
82468249
"NUMAKER_IOT_M487": {

0 commit comments

Comments
 (0)