Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
Nodemcu Firmware
Commits
262f831e
Commit
262f831e
authored
Jan 18, 2015
by
zeroday
Browse files
Merge pull request #107 from iabdalkader/spi
Add SPI Module (master mode only)
parents
35d2b9e6
3c160146
Changes
9
Show whitespace changes
Inline
Side-by-side
app/driver/spi.c
View file @
262f831e
...
@@ -64,13 +64,12 @@ void spi_lcd_9bit_write(uint8 spi_no,uint8 high_bit,uint8 low_8bit)
...
@@ -64,13 +64,12 @@ void spi_lcd_9bit_write(uint8 spi_no,uint8 high_bit,uint8 low_8bit)
* Description : SPI master initial function for common byte units transmission
* Description : SPI master initial function for common byte units transmission
* Parameters : uint8 spi_no - SPI module number, Only "SPI" and "HSPI" are valid
* Parameters : uint8 spi_no - SPI module number, Only "SPI" and "HSPI" are valid
*******************************************************************************/
*******************************************************************************/
void
spi_master_init
(
uint8
spi_no
)
void
spi_master_init
(
uint8
spi_no
,
unsigned
cpol
,
unsigned
cpha
,
unsigned
databits
,
uint32_t
clock
)
{
{
uint32
regvalue
;
uint32
regvalue
;
if
(
spi_no
>
1
)
return
;
//handle invalid input number
if
(
spi_no
>
1
)
return
;
//handle invalid input number
if
(
spi_no
==
SPI
){
if
(
spi_no
==
SPI
){
WRITE_PERI_REG
(
PERIPHS_IO_MUX
,
0x005
);
WRITE_PERI_REG
(
PERIPHS_IO_MUX
,
0x005
);
PIN_FUNC_SELECT
(
PERIPHS_IO_MUX_SD_CLK_U
,
1
);
//configure io to spi mode
PIN_FUNC_SELECT
(
PERIPHS_IO_MUX_SD_CLK_U
,
1
);
//configure io to spi mode
...
@@ -86,13 +85,33 @@ void spi_master_init(uint8 spi_no)
...
@@ -86,13 +85,33 @@ void spi_master_init(uint8 spi_no)
PIN_FUNC_SELECT
(
PERIPHS_IO_MUX_MTDO_U
,
2
);
//configure io to spi mode
PIN_FUNC_SELECT
(
PERIPHS_IO_MUX_MTDO_U
,
2
);
//configure io to spi mode
}
}
SET_PERI_REG_MASK
(
SPI_USER
(
spi_no
),
SPI_CS_SETUP
|
SPI_CS_HOLD
|
SPI_USR_COMMAND
|
SPI_USR_MOSI
);
SET_PERI_REG_MASK
(
SPI_USER
(
spi_no
),
SPI_CS_SETUP
|
SPI_CS_HOLD
|
SPI_DOUTDIN
|
SPI_USR_MOSI
);
CLEAR_PERI_REG_MASK
(
SPI_USER
(
spi_no
),
SPI_FLASH_MODE
);
//set clock polarity
// TODO: This doesn't work
//if (cpol == 1) {
// SET_PERI_REG_MASK(SPI_CTRL2(spi_no), (SPI_CK_OUT_HIGH_MODE<<SPI_CK_OUT_HIGH_MODE_S));
//} else {
// SET_PERI_REG_MASK(SPI_CTRL2(spi_no), (SPI_CK_OUT_LOW_MODE<<SPI_CK_OUT_LOW_MODE_S));
//}
//os_printf("SPI_CTRL2 is %08x\n",READ_PERI_REG(SPI_CTRL2(spi_no)));
//set clock phase
if
(
cpha
==
1
)
{
SET_PERI_REG_MASK
(
SPI_USER
(
spi_no
),
SPI_CK_OUT_EDGE
|
SPI_CK_I_EDGE
);
}
else
{
CLEAR_PERI_REG_MASK
(
SPI_USER
(
spi_no
),
SPI_CK_OUT_EDGE
|
SPI_CK_I_EDGE
);
}
CLEAR_PERI_REG_MASK
(
SPI_USER
(
HSPI
),
SPI_FLASH_MODE
|
SPI_WR_BYTE_ORDER
|
SPI_USR_MISO
|
SPI_RD_BYTE_ORDER
|
SPI_USR_ADDR
|
SPI_USR_COMMAND
|
SPI_USR_DUMMY
);
//clear Daul or Quad lines transmission mode
//clear Daul or Quad lines transmission mode
CLEAR_PERI_REG_MASK
(
SPI_CTRL
(
spi_no
),
SPI_QIO_MODE
|
SPI_DIO_MODE
|
SPI_DOUT_MODE
|
SPI_QOUT_MODE
);
CLEAR_PERI_REG_MASK
(
SPI_CTRL
(
spi_no
),
SPI_QIO_MODE
|
SPI_DIO_MODE
|
SPI_DOUT_MODE
|
SPI_QOUT_MODE
);
// SPI clock=CPU clock/8
WRITE_PERI_REG
(
SPI_CLOCK
(
spi_no
),
WRITE_PERI_REG
(
SPI_CLOCK
(
spi_no
),
((
1
&
SPI_CLKDIV_PRE
)
<<
SPI_CLKDIV_PRE_S
)
|
((
3
&
SPI_CLKCNT_N
)
<<
SPI_CLKCNT_N_S
)
|
((
3
&
SPI_CLKCNT_N
)
<<
SPI_CLKCNT_N_S
)
|
((
1
&
SPI_CLKCNT_H
)
<<
SPI_CLKCNT_H_S
)
|
((
1
&
SPI_CLKCNT_H
)
<<
SPI_CLKCNT_H_S
)
|
((
3
&
SPI_CLKCNT_L
)
<<
SPI_CLKCNT_L_S
));
//clear bit 31,set SPI clock div
((
3
&
SPI_CLKCNT_L
)
<<
SPI_CLKCNT_L_S
));
//clear bit 31,set SPI clock div
...
@@ -109,21 +128,19 @@ void spi_master_init(uint8 spi_no)
...
@@ -109,21 +128,19 @@ void spi_master_init(uint8 spi_no)
* Parameters : uint8 spi_no - SPI module number, Only "SPI" and "HSPI" are valid
* Parameters : uint8 spi_no - SPI module number, Only "SPI" and "HSPI" are valid
* uint8 data- transmitted data
* uint8 data- transmitted data
*******************************************************************************/
*******************************************************************************/
void
spi_mast_byte_write
(
uint8
spi_no
,
uint8
data
)
void
spi_mast_byte_write
(
uint8
spi_no
,
uint8
*
data
)
{
{
uint32
regvalue
;
if
(
spi_no
>
1
)
return
;
//handle invalid input number
if
(
spi_no
>
1
)
return
;
//handle invalid input number
while
(
READ_PERI_REG
(
SPI_CMD
(
spi_no
))
&
SPI_USR
);
while
(
READ_PERI_REG
(
SPI_CMD
(
spi_no
))
&
SPI_USR
);
CLEAR_PERI_REG_MASK
(
SPI_USER
(
spi_no
),
SPI_USR_MOSI
|
SPI_USR_MISO
);
//SPI_FLASH_USER2 bit28-31 is cmd length,cmd bit length is value(0-15)+1,
WRITE_PERI_REG
(
SPI_W0
(
HSPI
),
*
data
);
// bit15-0 is cmd value.
WRITE_PERI_REG
(
SPI_USER2
(
spi_no
),
((
7
&
SPI_USR_COMMAND_BITLEN
)
<<
SPI_USR_COMMAND_BITLEN_S
)
|
((
uint32
)
data
));
SET_PERI_REG_MASK
(
SPI_CMD
(
spi_no
),
SPI_USR
);
SET_PERI_REG_MASK
(
SPI_CMD
(
spi_no
),
SPI_USR
);
}
while
(
READ_PERI_REG
(
SPI_CMD
(
spi_no
))
&
SPI_USR
);
*
data
=
(
uint8
)(
READ_PERI_REG
(
SPI_W0
(
spi_no
))
&
0xff
);
}
/******************************************************************************
/******************************************************************************
* FunctionName : spi_byte_write_espslave
* FunctionName : spi_byte_write_espslave
...
...
app/include/driver/spi.h
View file @
262f831e
...
@@ -18,9 +18,9 @@ void spi_lcd_mode_init(uint8 spi_no);
...
@@ -18,9 +18,9 @@ void spi_lcd_mode_init(uint8 spi_no);
void
spi_lcd_9bit_write
(
uint8
spi_no
,
uint8
high_bit
,
uint8
low_8bit
);
void
spi_lcd_9bit_write
(
uint8
spi_no
,
uint8
high_bit
,
uint8
low_8bit
);
//spi master init funtion
//spi master init funtion
void
spi_master_init
(
uint8
spi_no
);
void
spi_master_init
(
uint8
spi_no
,
unsigned
cpol
,
unsigned
cpha
,
unsigned
databits
,
uint32_t
clock
);
//use spi send 8bit data
//use spi send 8bit data
void
spi_mast_byte_write
(
uint8
spi_no
,
uint8
data
);
void
spi_mast_byte_write
(
uint8
spi_no
,
uint8
*
data
);
//transmit data to esp8266 slave buffer,which needs 16bit transmission ,
//transmit data to esp8266 slave buffer,which needs 16bit transmission ,
//first byte is master command 0x04, second byte is master data
//first byte is master command 0x04, second byte is master data
...
...
app/include/driver/spi_register.h
View file @
262f831e
...
@@ -39,6 +39,11 @@
...
@@ -39,6 +39,11 @@
#define SPI_MISO_DELAY_NUM_S 18
#define SPI_MISO_DELAY_NUM_S 18
#define SPI_MISO_DELAY_MODE 0x00000003
#define SPI_MISO_DELAY_MODE 0x00000003
#define SPI_MISO_DELAY_MODE_S 16
#define SPI_MISO_DELAY_MODE_S 16
#define SPI_CK_OUT_HIGH_MODE 0x0000000F
#define SPI_CK_OUT_HIGH_MODE_S 12
#define SPI_CK_OUT_LOW_MODE 0x0000000F
#define SPI_CK_OUT_LOW_MODE_S 8
#define SPI_CLOCK(i) (REG_SPI_BASE(i) + 0x18)
#define SPI_CLOCK(i) (REG_SPI_BASE(i) + 0x18)
#define SPI_CLK_EQU_SYSCLK (BIT(31))
#define SPI_CLK_EQU_SYSCLK (BIT(31))
#define SPI_CLKDIV_PRE 0x00001FFF
#define SPI_CLKDIV_PRE 0x00001FFF
...
@@ -73,6 +78,7 @@
...
@@ -73,6 +78,7 @@
#define SPI_CS_SETUP (BIT(5))
#define SPI_CS_SETUP (BIT(5))
#define SPI_CS_HOLD (BIT(4))
#define SPI_CS_HOLD (BIT(4))
#define SPI_FLASH_MODE (BIT(2))
#define SPI_FLASH_MODE (BIT(2))
#define SPI_DOUTDIN (BIT(0))
#define SPI_USER1(i) (REG_SPI_BASE(i) + 0x20)
#define SPI_USER1(i) (REG_SPI_BASE(i) + 0x20)
#define SPI_USR_ADDR_BITLEN 0x0000003F
#define SPI_USR_ADDR_BITLEN 0x0000003F
...
...
app/include/user_config.h
View file @
262f831e
...
@@ -55,6 +55,7 @@
...
@@ -55,6 +55,7 @@
#define LUA_USE_MODULES_NET
#define LUA_USE_MODULES_NET
#define LUA_USE_MODULES_PWM
#define LUA_USE_MODULES_PWM
#define LUA_USE_MODULES_I2C
#define LUA_USE_MODULES_I2C
#define LUA_USE_MODULES_SPI
#define LUA_USE_MODULES_TMR
#define LUA_USE_MODULES_TMR
#define LUA_USE_MODULES_ADC
#define LUA_USE_MODULES_ADC
#define LUA_USE_MODULES_UART
#define LUA_USE_MODULES_UART
...
...
app/modules/modules.h
View file @
262f831e
...
@@ -45,6 +45,14 @@
...
@@ -45,6 +45,14 @@
#define ROM_MODULES_I2C
#define ROM_MODULES_I2C
#endif
#endif
#if defined(LUA_USE_MODULES_SPI)
#define MODULES_SPI "spi"
#define ROM_MODULES_SPI \
_ROM(MODULES_SPI, luaopen_spi, spi_map)
#else
#define ROM_MODULES_SPI
#endif
#if defined(LUA_USE_MODULES_TMR)
#if defined(LUA_USE_MODULES_TMR)
#define MODULES_TMR "tmr"
#define MODULES_TMR "tmr"
#define ROM_MODULES_TMR \
#define ROM_MODULES_TMR \
...
@@ -106,6 +114,7 @@
...
@@ -106,6 +114,7 @@
ROM_MODULES_PWM \
ROM_MODULES_PWM \
ROM_MODULES_WIFI \
ROM_MODULES_WIFI \
ROM_MODULES_I2C \
ROM_MODULES_I2C \
ROM_MODULES_SPI \
ROM_MODULES_TMR \
ROM_MODULES_TMR \
ROM_MODULES_NODE \
ROM_MODULES_NODE \
ROM_MODULES_FILE \
ROM_MODULES_FILE \
...
...
app/modules/spi.c
0 → 100644
View file @
262f831e
// Module for interfacing with the SPI interface
//#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
#include "platform.h"
#include "auxmods.h"
#include "lrotable.h"
// Lua: = spi.setup( id, mode, cpol, cpha, databits, clock )
static
int
spi_setup
(
lua_State
*
L
)
{
unsigned
id
=
luaL_checkinteger
(
L
,
1
);
unsigned
mode
=
luaL_checkinteger
(
L
,
2
);
unsigned
cpol
=
luaL_checkinteger
(
L
,
3
);
unsigned
cpha
=
luaL_checkinteger
(
L
,
4
);
unsigned
databits
=
luaL_checkinteger
(
L
,
5
);
uint32_t
clock
=
luaL_checkinteger
(
L
,
6
);
MOD_CHECK_ID
(
spi
,
id
);
if
(
mode
!=
PLATFORM_SPI_SLAVE
&&
mode
!=
PLATFORM_SPI_MASTER
)
{
return
luaL_error
(
L
,
"wrong arg type"
);
}
if
(
cpol
!=
PLATFORM_SPI_CPOL_LOW
&&
cpol
!=
PLATFORM_SPI_CPOL_HIGH
)
{
return
luaL_error
(
L
,
"wrong arg type"
);
}
if
(
cpha
!=
PLATFORM_SPI_CPHA_LOW
&&
cpha
!=
PLATFORM_SPI_CPHA_HIGH
)
{
return
luaL_error
(
L
,
"wrong arg type"
);
}
if
(
databits
!=
PLATFORM_SPI_DATABITS_8
&&
databits
!=
PLATFORM_SPI_DATABITS_16
)
{
return
luaL_error
(
L
,
"wrong arg type"
);
}
u32
res
=
platform_spi_setup
(
id
,
mode
,
cpol
,
cpha
,
databits
,
clock
);
lua_pushinteger
(
L
,
res
);
return
1
;
}
// Lua: wrote = spi.send( id, data1, [data2], ..., [datan] )
// data can be either a string, a table or an 8-bit number
static
int
spi_send
(
lua_State
*
L
)
{
unsigned
id
=
luaL_checkinteger
(
L
,
1
);
const
char
*
pdata
;
size_t
datalen
,
i
;
int
numdata
;
u32
wrote
=
0
;
unsigned
argn
;
MOD_CHECK_ID
(
spi
,
id
);
if
(
lua_gettop
(
L
)
<
2
)
return
luaL_error
(
L
,
"wrong arg type"
);
for
(
argn
=
2
;
argn
<=
lua_gettop
(
L
);
argn
++
)
{
// lua_isnumber() would silently convert a string of digits to an integer
// whereas here strings are handled separately.
if
(
lua_type
(
L
,
argn
)
==
LUA_TNUMBER
)
{
numdata
=
(
int
)
luaL_checkinteger
(
L
,
argn
);
if
(
numdata
<
0
||
numdata
>
255
)
return
luaL_error
(
L
,
"wrong arg range"
);
platform_spi_send_recv
(
id
,
numdata
);
wrote
++
;
}
else
if
(
lua_istable
(
L
,
argn
)
)
{
datalen
=
lua_objlen
(
L
,
argn
);
for
(
i
=
0
;
i
<
datalen
;
i
++
)
{
lua_rawgeti
(
L
,
argn
,
i
+
1
);
numdata
=
(
int
)
luaL_checkinteger
(
L
,
-
1
);
lua_pop
(
L
,
1
);
if
(
numdata
<
0
||
numdata
>
255
)
return
luaL_error
(
L
,
"wrong arg range"
);
platform_spi_send_recv
(
id
,
numdata
);
}
wrote
+=
i
;
if
(
i
<
datalen
)
break
;
}
else
{
pdata
=
luaL_checklstring
(
L
,
argn
,
&
datalen
);
for
(
i
=
0
;
i
<
datalen
;
i
++
)
platform_spi_send_recv
(
id
,
pdata
[
i
]
);
wrote
+=
i
;
if
(
i
<
datalen
)
break
;
}
}
lua_pushinteger
(
L
,
wrote
);
return
1
;
}
// Lua: read = spi.recv( id, size )
static
int
spi_recv
(
lua_State
*
L
)
{
unsigned
id
=
luaL_checkinteger
(
L
,
1
);
u32
size
=
(
u32
)
luaL_checkinteger
(
L
,
2
),
i
;
luaL_Buffer
b
;
spi_data_type
data
;
MOD_CHECK_ID
(
spi
,
id
);
if
(
size
==
0
)
{
return
0
;
}
luaL_buffinit
(
L
,
&
b
);
for
(
i
=
0
;
i
<
size
;
i
++
)
{
data
=
platform_spi_send_recv
(
id
,
0xFF
);
luaL_addchar
(
&
b
,
(
char
)
data
);
}
luaL_pushresult
(
&
b
);
return
1
;
}
// Module function map
#define MIN_OPT_LEVEL 2
#include "lrodefs.h"
const
LUA_REG_TYPE
spi_map
[]
=
{
{
LSTRKEY
(
"setup"
),
LFUNCVAL
(
spi_setup
)
},
{
LSTRKEY
(
"send"
),
LFUNCVAL
(
spi_send
)
},
{
LSTRKEY
(
"recv"
),
LFUNCVAL
(
spi_recv
)
},
#if LUA_OPTIMIZE_MEMORY > 0
{
LSTRKEY
(
"MASTER"
),
LNUMVAL
(
PLATFORM_SPI_MASTER
)
},
{
LSTRKEY
(
"SLAVE"
),
LNUMVAL
(
PLATFORM_SPI_SLAVE
)
},
{
LSTRKEY
(
"CPHA_LOW"
),
LNUMVAL
(
PLATFORM_SPI_CPHA_LOW
)
},
{
LSTRKEY
(
"CPHA_HIGH"
),
LNUMVAL
(
PLATFORM_SPI_CPHA_HIGH
)
},
{
LSTRKEY
(
"CPOL_LOW"
),
LNUMVAL
(
PLATFORM_SPI_CPOL_LOW
)
},
{
LSTRKEY
(
"CPOL_HIGH"
),
LNUMVAL
(
PLATFORM_SPI_CPOL_HIGH
)
},
{
LSTRKEY
(
"DATABITS_8"
),
LNUMVAL
(
PLATFORM_SPI_DATABITS_8
)
},
{
LSTRKEY
(
"DATABITS_16"
),
LNUMVAL
(
PLATFORM_SPI_DATABITS_16
)
},
#endif // #if LUA_OPTIMIZE_MEMORY > 0
{
LNILKEY
,
LNILVAL
}
};
LUALIB_API
int
luaopen_spi
(
lua_State
*
L
)
{
#if LUA_OPTIMIZE_MEMORY > 0
return
0
;
#else // #if LUA_OPTIMIZE_MEMORY > 0
luaL_register
(
L
,
AUXLIB_SPI
,
spi_map
);
// Add constants
MOD_REG_NUMBER
(
L
,
"MASTER"
,
PLATFORM_SPI_MASTER
);
MOD_REG_NUMBER
(
L
,
"SLAVE"
,
PLATFORM_SPI_SLAVE
);
MOD_REG_NUMBER
(
L
,
"CPHA_LOW"
,
PLATFORM_SPI_CPHA_LOW
);
MOD_REG_NUMBER
(
L
,
"CPHA_HIGH"
,
PLATFORM_SPI_CPHA_HIGH
);
MOD_REG_NUMBER
(
L
,
"CPOL_LOW"
,
PLATFORM_SPI_CPOL_LOW
);
MOD_REG_NUMBER
(
L
,
"CPOL_HIGH"
,
PLATFORM_SPI_CPOL_HIGH
);
MOD_REG_NUMBER
(
L
,
"DATABITS_8"
,
PLATFORM_SPI_DATABITS_8
);
MOD_REG_NUMBER
(
L
,
"DATABITS_16"
,
PLATFORM_SPI_DATABITS_16
);
return
1
;
#endif // #if LUA_OPTIMIZE_MEMORY > 0
}
app/platform/cpu_esp8266.h
View file @
262f831e
...
@@ -8,7 +8,7 @@
...
@@ -8,7 +8,7 @@
#include "flash_api.h"
#include "flash_api.h"
// Number of resources (0 if not available/not implemented)
// Number of resources (0 if not available/not implemented)
#define NUM_GPIO GPIO_PIN_NUM
#define NUM_GPIO GPIO_PIN_NUM
#define NUM_SPI
1
#define NUM_SPI
2
#define NUM_UART 1
#define NUM_UART 1
#define NUM_PWM GPIO_PIN_NUM
#define NUM_PWM GPIO_PIN_NUM
#define NUM_ADC 1
#define NUM_ADC 1
...
...
app/platform/platform.c
View file @
262f831e
...
@@ -435,6 +435,20 @@ int platform_i2c_recv_byte( unsigned id, int ack ){
...
@@ -435,6 +435,20 @@ int platform_i2c_recv_byte( unsigned id, int ack ){
return
r
;
return
r
;
}
}
// *****************************************************************************
// SPI platform interface
uint32_t
platform_spi_setup
(
unsigned
id
,
int
mode
,
unsigned
cpol
,
unsigned
cpha
,
unsigned
databits
,
uint32_t
clock
)
{
spi_master_init
(
id
,
cpol
,
cpha
,
databits
,
clock
);
return
1
;
}
spi_data_type
platform_spi_send_recv
(
unsigned
id
,
spi_data_type
data
)
{
spi_mast_byte_write
(
id
,
&
data
);
return
data
;
}
// ****************************************************************************
// ****************************************************************************
// Flash access functions
// Flash access functions
...
...
app/platform/platform.h
View file @
262f831e
...
@@ -84,13 +84,23 @@ int platform_can_recv( unsigned id, uint32_t *canid, uint8_t *idtype, uint8_t *l
...
@@ -84,13 +84,23 @@ int platform_can_recv( unsigned id, uint32_t *canid, uint8_t *idtype, uint8_t *l
// SPI enable/disable
// SPI enable/disable
#define PLATFORM_SPI_ENABLE 1
#define PLATFORM_SPI_ENABLE 1
#define PLATFORM_SPI_DISABLE 0
#define PLATFORM_SPI_DISABLE 0
// SPI clock phase
#define PLATFORM_SPI_CPHA_LOW 0
#define PLATFORM_SPI_CPHA_HIGH 1
// SPI clock polarity
#define PLATFORM_SPI_CPOL_LOW 0
#define PLATFORM_SPI_CPOL_HIGH 1
// SPI databits
#define PLATFORM_SPI_DATABITS_8 8
#define PLATFORM_SPI_DATABITS_16 16
// Data types
// Data types
typedef
uint32_t
spi_data_type
;
typedef
uint32_t
spi_data_type
;
// The platform SPI functions
// The platform SPI functions
int
platform_spi_exists
(
unsigned
id
);
int
platform_spi_exists
(
unsigned
id
);
uint32_t
platform_spi_setup
(
unsigned
id
,
int
mode
,
uint32_t
clock
,
unsigned
cpol
,
unsigned
cpha
,
unsigned
databits
);
uint32_t
platform_spi_setup
(
unsigned
id
,
int
mode
,
unsigned
cpol
,
unsigned
cpha
,
unsigned
databits
,
uint32_t
clock
);
spi_data_type
platform_spi_send_recv
(
unsigned
id
,
spi_data_type
data
);
spi_data_type
platform_spi_send_recv
(
unsigned
id
,
spi_data_type
data
);
void
platform_spi_select
(
unsigned
id
,
int
is_select
);
void
platform_spi_select
(
unsigned
id
,
int
is_select
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment