luat_spi_idf5.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509
  1. #include "luat_base.h"
  2. #include "luat_gpio.h"
  3. #include "luat_spi.h"
  4. #include "luat_malloc.h"
  5. #include "driver/spi_master.h"
  6. #include "driver/gpio.h"
  7. #include "idf5_io_def.h"
  8. #define LUAT_LOG_TAG "spi"
  9. #include "luat_log.h"
  10. #if defined(CONFIG_IDF_TARGET_ESP32)||defined(CONFIG_IDF_TARGET_ESP32S2)||defined(CONFIG_IDF_TARGET_ESP32S3)
  11. #define SOC_SPI_NUM 2
  12. #else
  13. #define SOC_SPI_NUM 1
  14. #endif
  15. static spi_device_interface_config_t spi_config[SOC_SPI_NUM] = {0};
  16. static spi_device_handle_t spi_handle[SOC_SPI_NUM] = {0};
  17. int luat_spi_setup(luat_spi_t *spi){
  18. esp_err_t ret = -1;
  19. spi_bus_config_t buscfg = {
  20. .quadwp_io_num = -1,
  21. .quadhd_io_num = -1,
  22. .max_transfer_sz = SOC_SPI_MAXIMUM_BUFFER_SIZE
  23. };
  24. if (spi->id == 2){
  25. buscfg.miso_io_num = SPI2_MISO_IO_NUM;
  26. buscfg.mosi_io_num = SPI2_MOSI_IO_NUM;
  27. buscfg.sclk_io_num = SPI2_SCLK_IO_NUM;
  28. }
  29. #if defined(CONFIG_IDF_TARGET_ESP32)||defined(CONFIG_IDF_TARGET_ESP32S2)||defined(CONFIG_IDF_TARGET_ESP32S3)
  30. else if(spi->id == 3){
  31. buscfg.miso_io_num = SPI3_MISO_IO_NUM;
  32. buscfg.mosi_io_num = SPI3_MOSI_IO_NUM;
  33. buscfg.sclk_io_num = SPI3_SCLK_IO_NUM;
  34. }
  35. #endif
  36. else{
  37. return -1;
  38. }
  39. ret = spi_bus_initialize(spi->id-1, &buscfg, SPI_DMA_CH_AUTO);
  40. if (ret != 0){
  41. return ret;
  42. }
  43. spi_device_interface_config_t* dev_config = &spi_config[spi->id-2];
  44. memset(dev_config, 0, sizeof(spi_device_interface_config_t));
  45. if (spi->CPHA == 0){
  46. if (spi->CPOL == 0)
  47. dev_config->mode = 0;
  48. if (spi->CPOL == 1)
  49. dev_config->mode = 1;
  50. }else{
  51. if (spi->CPOL == 0)
  52. dev_config->mode = 2;
  53. if (spi->CPOL == 1)
  54. dev_config->mode = 3;
  55. }
  56. if (spi->mode == 0){
  57. dev_config->flags |= SPI_DEVICE_HALFDUPLEX;
  58. }
  59. dev_config->clock_speed_hz = spi->bandrate;
  60. if (spi->cs == Luat_GPIO_MAX_ID)
  61. dev_config->spics_io_num = -1;
  62. else
  63. dev_config->spics_io_num = spi->cs;
  64. dev_config->queue_size = 7;
  65. ret = spi_bus_add_device(spi->id-1, dev_config, &spi_handle[spi->id-2]);
  66. return ret;
  67. }
  68. int luat_spi_close(int spi_id){
  69. esp_err_t ret = -1;
  70. #if defined(CONFIG_IDF_TARGET_ESP32)||defined(CONFIG_IDF_TARGET_ESP32S2)||defined(CONFIG_IDF_TARGET_ESP32S3)
  71. if (spi_id > 3 || spi_id < 2){
  72. return -1;
  73. }
  74. #else
  75. if (spi_id != 2){
  76. return -1;
  77. }
  78. #endif
  79. ret = spi_bus_remove_device(spi_handle[spi_id-2]);
  80. if (ret != 0){
  81. return ret;
  82. }
  83. ret = spi_bus_free(spi_id-1);
  84. return ret;
  85. }
  86. int luat_spi_transfer(int spi_id, const char *send_buf, size_t send_length, char *recv_buf, size_t recv_length){
  87. spi_transaction_t send = {0};
  88. spi_transaction_t recv = {0};
  89. esp_err_t ret = -1;
  90. size_t transmit_length = send_length;
  91. #if defined(CONFIG_IDF_TARGET_ESP32)||defined(CONFIG_IDF_TARGET_ESP32S2)||defined(CONFIG_IDF_TARGET_ESP32S3)
  92. if (spi_id > 3 || spi_id < 2){
  93. return -1;
  94. }
  95. #else
  96. if (spi_id != 2){
  97. return -1;
  98. }
  99. #endif
  100. if ((spi_config[spi_id-2].flags & SPI_DEVICE_HALFDUPLEX) != 0){
  101. while (send_length > 0) {
  102. memset(&send, 0, sizeof(send));
  103. if (send_length > SOC_SPI_MAXIMUM_BUFFER_SIZE ) {
  104. send.length = SOC_SPI_MAXIMUM_BUFFER_SIZE * 8;
  105. send.tx_buffer = send_buf;
  106. ret = spi_device_polling_transmit(spi_handle[spi_id-2], &send);
  107. send_buf += SOC_SPI_MAXIMUM_BUFFER_SIZE ;
  108. send_length -= SOC_SPI_MAXIMUM_BUFFER_SIZE ;
  109. }
  110. else {
  111. send.length = send_length * 8;
  112. send.tx_buffer = send_buf;
  113. ret = spi_device_polling_transmit(spi_handle[spi_id-2], &send);
  114. break;
  115. }
  116. }
  117. if (ret != 0){
  118. return -2;
  119. }
  120. recv.length = recv_length * 8;
  121. recv.rxlength = recv_length * 8;
  122. recv.rx_buffer = recv_buf;
  123. ret = spi_device_polling_transmit(spi_handle[spi_id-2], &recv);
  124. }else{
  125. while (send_length > 0) {
  126. memset(&send, 0, sizeof(send));
  127. if (send_length > SOC_SPI_MAXIMUM_BUFFER_SIZE ) {
  128. send.length = SOC_SPI_MAXIMUM_BUFFER_SIZE * 8;
  129. send.tx_buffer = send_buf;
  130. send.rxlength = SOC_SPI_MAXIMUM_BUFFER_SIZE * 8;
  131. send.rx_buffer = recv_buf;
  132. ret = spi_device_polling_transmit(spi_handle[spi_id-2], &send);
  133. send_buf += SOC_SPI_MAXIMUM_BUFFER_SIZE ;
  134. send_length -= SOC_SPI_MAXIMUM_BUFFER_SIZE ;
  135. recv_buf += SOC_SPI_MAXIMUM_BUFFER_SIZE ;
  136. recv_length -= SOC_SPI_MAXIMUM_BUFFER_SIZE ;
  137. }
  138. else {
  139. send.length = send_length * 8;
  140. send.tx_buffer = send_buf;
  141. send.rxlength = send_length * 8;
  142. send.rx_buffer = recv_buf;
  143. ret = spi_device_polling_transmit(spi_handle[spi_id-2], &send);
  144. break;
  145. }
  146. }
  147. if (ret != 0){
  148. return -2;
  149. }
  150. }
  151. return ret == 0 ? transmit_length : -1;
  152. }
  153. int luat_spi_recv(int spi_id, char *recv_buf, size_t length){
  154. spi_transaction_t t;
  155. esp_err_t ret = -1;
  156. size_t transmit_length = length;
  157. #if defined(CONFIG_IDF_TARGET_ESP32)||defined(CONFIG_IDF_TARGET_ESP32S2)||defined(CONFIG_IDF_TARGET_ESP32S3)
  158. if (spi_id > 3 || spi_id < 2){
  159. return -1;
  160. }
  161. #else
  162. if (spi_id != 2){
  163. return -1;
  164. }
  165. #endif
  166. char tmpbuff[SOC_SPI_MAXIMUM_BUFFER_SIZE];
  167. while (length > 0) {
  168. memset(&t, 0, sizeof(t));
  169. if ((spi_config[spi_id-2].flags & SPI_DEVICE_HALFDUPLEX) == 0){
  170. t.tx_buffer = tmpbuff;
  171. memset(tmpbuff, 0xFF, SOC_SPI_MAXIMUM_BUFFER_SIZE);
  172. }
  173. if (length > SOC_SPI_MAXIMUM_BUFFER_SIZE ) {
  174. if ((spi_config[spi_id-2].flags & SPI_DEVICE_HALFDUPLEX) == 0){
  175. t.length = SOC_SPI_MAXIMUM_BUFFER_SIZE * 8;
  176. }
  177. t.rxlength = SOC_SPI_MAXIMUM_BUFFER_SIZE * 8;
  178. t.rx_buffer = recv_buf;
  179. ret = spi_device_polling_transmit(spi_handle[spi_id-2], &t);
  180. recv_buf += SOC_SPI_MAXIMUM_BUFFER_SIZE ;
  181. length -= SOC_SPI_MAXIMUM_BUFFER_SIZE ;
  182. }
  183. else {
  184. t.rxlength = length * 8;
  185. t.rx_buffer = recv_buf;
  186. if ((spi_config[spi_id-2].flags & SPI_DEVICE_HALFDUPLEX) == 0){
  187. t.length = length * 8;
  188. }
  189. ret = spi_device_polling_transmit(spi_handle[spi_id-2], &t);
  190. break;
  191. }
  192. }
  193. return ret == 0 ? transmit_length : -1;
  194. }
  195. int luat_spi_send(int spi_id, const char *send_buf, size_t length){
  196. spi_transaction_t t;
  197. esp_err_t ret = -1;
  198. size_t transmit_length = length;
  199. #if defined(CONFIG_IDF_TARGET_ESP32)||defined(CONFIG_IDF_TARGET_ESP32S2)||defined(CONFIG_IDF_TARGET_ESP32S3)
  200. if (spi_id > 3 || spi_id < 2){
  201. return -1;
  202. }
  203. #else
  204. if (spi_id != 2){
  205. return -1;
  206. }
  207. #endif
  208. char tmpbuff[SOC_SPI_MAXIMUM_BUFFER_SIZE];
  209. while (length > 0) {
  210. memset(&t, 0, sizeof(t));
  211. if ((spi_config[spi_id-2].flags & SPI_DEVICE_HALFDUPLEX) != 0){
  212. t.rx_buffer = tmpbuff;
  213. memset(tmpbuff, 0xFF, SOC_SPI_MAXIMUM_BUFFER_SIZE);
  214. }
  215. if (length > SOC_SPI_MAXIMUM_BUFFER_SIZE ) {
  216. t.length = SOC_SPI_MAXIMUM_BUFFER_SIZE * 8;
  217. t.tx_buffer = send_buf;
  218. if ((spi_config[spi_id-2].flags & SPI_DEVICE_HALFDUPLEX) != 0){
  219. t.rxlength = SOC_SPI_MAXIMUM_BUFFER_SIZE * 8;
  220. }
  221. ret = spi_device_polling_transmit(spi_handle[spi_id-2], &t);
  222. send_buf += SOC_SPI_MAXIMUM_BUFFER_SIZE ;
  223. length -= SOC_SPI_MAXIMUM_BUFFER_SIZE ;
  224. }
  225. else {
  226. t.length = length * 8;
  227. t.tx_buffer = send_buf;
  228. if ((spi_config[spi_id-2].flags & SPI_DEVICE_HALFDUPLEX) != 0){
  229. t.rxlength = length * 8;
  230. }
  231. ret = spi_device_polling_transmit(spi_handle[spi_id-2], &t);
  232. break;
  233. }
  234. }
  235. return ret == 0 ? transmit_length : -1;
  236. }
  237. #define LUAT_SPI_CS_SELECT 0
  238. #define LUAT_SPI_CS_CLEAR 1
  239. static uint8_t spi_bus[SOC_SPI_NUM] = {0};
  240. int luat_spi_device_setup(luat_spi_device_t *spi_dev){
  241. esp_err_t ret = -1;
  242. int bus_id = spi_dev->bus_id;
  243. spi_device_handle_t *spi_device = luat_heap_malloc(sizeof(spi_device_handle_t));
  244. if (spi_device == NULL)
  245. return ret;
  246. spi_dev->user_data = (void *)spi_device;
  247. #if defined(CONFIG_IDF_TARGET_ESP32)||defined(CONFIG_IDF_TARGET_ESP32S2)||defined(CONFIG_IDF_TARGET_ESP32S3)
  248. if (bus_id > 3 || bus_id < 2){
  249. return -1;
  250. }
  251. #else
  252. if (bus_id != 2){
  253. return -1;
  254. }
  255. #endif
  256. if (spi_bus[bus_id-2] == 0){
  257. spi_bus_config_t buscfg = {
  258. .quadwp_io_num = -1,
  259. .quadhd_io_num = -1,
  260. .max_transfer_sz = SOC_SPI_MAXIMUM_BUFFER_SIZE
  261. };
  262. if (bus_id == 2){
  263. buscfg.miso_io_num = SPI2_MISO_IO_NUM;
  264. buscfg.mosi_io_num = SPI2_MOSI_IO_NUM;
  265. buscfg.sclk_io_num = SPI2_SCLK_IO_NUM;
  266. }
  267. #if defined(CONFIG_IDF_TARGET_ESP32)||defined(CONFIG_IDF_TARGET_ESP32S2)||defined(CONFIG_IDF_TARGET_ESP32S3)
  268. else{
  269. buscfg.miso_io_num = SPI3_MISO_IO_NUM;
  270. buscfg.mosi_io_num = SPI3_MOSI_IO_NUM;
  271. buscfg.sclk_io_num = SPI3_SCLK_IO_NUM;
  272. }
  273. #endif
  274. ret = spi_bus_initialize(bus_id-1, &buscfg, SPI_DMA_CH_AUTO);
  275. if (ret != 0){
  276. return ret;
  277. }
  278. spi_bus[bus_id-2] = 1;
  279. }
  280. spi_device_interface_config_t* dev_config = &spi_config[bus_id-2];
  281. memset(dev_config, 0, sizeof(spi_device_interface_config_t));
  282. if (spi_dev->spi_config.CPHA == 0){
  283. if (spi_dev->spi_config.CPOL == 0)
  284. dev_config->mode = 0;
  285. if (spi_dev->spi_config.CPOL == 1)
  286. dev_config->mode = 1;
  287. }else{
  288. if (spi_dev->spi_config.CPOL == 0)
  289. dev_config->mode = 2;
  290. if (spi_dev->spi_config.CPOL == 1)
  291. dev_config->mode = 3;
  292. }
  293. if (spi_dev->spi_config.mode == 0){
  294. dev_config->flags |= SPI_DEVICE_HALFDUPLEX;
  295. }
  296. dev_config->clock_speed_hz = spi_dev->spi_config.bandrate;
  297. dev_config->spics_io_num = -1;
  298. dev_config->queue_size = 7;
  299. ret = spi_bus_add_device(bus_id-1, dev_config, spi_device);
  300. if (ret != 0)
  301. luat_heap_free(spi_device);
  302. luat_gpio_mode(spi_dev->spi_config.cs, Luat_GPIO_OUTPUT, Luat_GPIO_DEFAULT, Luat_GPIO_HIGH);
  303. return ret;
  304. }
  305. int luat_spi_device_close(luat_spi_device_t *spi_dev){
  306. esp_err_t ret = -1;
  307. int bus_id = spi_dev->bus_id;
  308. #if defined(CONFIG_IDF_TARGET_ESP32)||defined(CONFIG_IDF_TARGET_ESP32S2)||defined(CONFIG_IDF_TARGET_ESP32S3)
  309. if (bus_id > 3 || bus_id < 2){
  310. return -1;
  311. }
  312. #else
  313. if (bus_id != 2){
  314. return -1;
  315. }
  316. #endif
  317. ret = spi_bus_remove_device(*(spi_device_handle_t *)(spi_dev->user_data));
  318. luat_heap_free((spi_device_handle_t *)(spi_dev->user_data));
  319. return ret;
  320. }
  321. int luat_spi_device_transfer(luat_spi_device_t *spi_dev, const char *send_buf, size_t send_length, char *recv_buf, size_t recv_length){
  322. if (spi_dev->spi_config.cs != 255)
  323. luat_gpio_set(spi_dev->spi_config.cs, LUAT_SPI_CS_SELECT);
  324. spi_transaction_t send = {0};
  325. spi_transaction_t recv = {0};
  326. esp_err_t ret = -1;
  327. size_t transmit_length = send_length;
  328. int bus_id = spi_dev->bus_id;
  329. #if defined(CONFIG_IDF_TARGET_ESP32)||defined(CONFIG_IDF_TARGET_ESP32S2)||defined(CONFIG_IDF_TARGET_ESP32S3)
  330. if (bus_id > 3 || bus_id < 2){
  331. return -1;
  332. }
  333. #else
  334. if (bus_id != 2){
  335. return -1;
  336. }
  337. #endif
  338. while (send_length > 0) {
  339. memset(&send, 0, sizeof(send));
  340. if (send_length > SOC_SPI_MAXIMUM_BUFFER_SIZE ) {
  341. send.length = SOC_SPI_MAXIMUM_BUFFER_SIZE * 8;
  342. send.tx_buffer = send_buf;
  343. ret = spi_device_polling_transmit(*(spi_device_handle_t *)(spi_dev->user_data), &send);
  344. send_buf += SOC_SPI_MAXIMUM_BUFFER_SIZE ;
  345. send_length -= SOC_SPI_MAXIMUM_BUFFER_SIZE ;
  346. }else {
  347. send.length = send_length * 8;
  348. send.tx_buffer = send_buf;
  349. ret = spi_device_polling_transmit(*(spi_device_handle_t *)(spi_dev->user_data), &send);
  350. break;
  351. }
  352. }
  353. if (ret != 0){
  354. return -2;
  355. }
  356. recv.length = recv_length * 8;
  357. recv.rxlength = recv_length * 8;
  358. recv.rx_buffer = recv_buf;
  359. ret = spi_device_polling_transmit(*(spi_device_handle_t *)(spi_dev->user_data), &recv);
  360. if (spi_dev->spi_config.cs != 255)
  361. luat_gpio_set(spi_dev->spi_config.cs, LUAT_SPI_CS_CLEAR);
  362. return ret == 0 ? transmit_length : -1;
  363. }
  364. int luat_spi_device_recv(luat_spi_device_t *spi_dev, char *recv_buf, size_t length){
  365. if (spi_dev->spi_config.cs != 255)
  366. luat_gpio_set(spi_dev->spi_config.cs, LUAT_SPI_CS_SELECT);
  367. spi_transaction_t t = {0};
  368. esp_err_t ret = -1;
  369. size_t transmit_length = length;
  370. int bus_id = spi_dev->bus_id;
  371. #if defined(CONFIG_IDF_TARGET_ESP32)||defined(CONFIG_IDF_TARGET_ESP32S2)||defined(CONFIG_IDF_TARGET_ESP32S3)
  372. if (bus_id > 3 || bus_id < 2){
  373. return -1;
  374. }
  375. #else
  376. if (bus_id != 2){
  377. return -1;
  378. }
  379. #endif
  380. bool is_full_duplex = spi_dev->spi_config.mode;
  381. char tmpbuff[SOC_SPI_MAXIMUM_BUFFER_SIZE];
  382. while (length > 0) {
  383. memset(&t, 0, sizeof(t));
  384. if (is_full_duplex) {
  385. t.tx_buffer = tmpbuff;
  386. memset(tmpbuff, 0xff, SOC_SPI_MAXIMUM_BUFFER_SIZE);
  387. }
  388. if (length > SOC_SPI_MAXIMUM_BUFFER_SIZE ) {
  389. if (is_full_duplex) {
  390. t.length = SOC_SPI_MAXIMUM_BUFFER_SIZE * 8;
  391. }
  392. t.rxlength = SOC_SPI_MAXIMUM_BUFFER_SIZE * 8;
  393. t.rx_buffer = recv_buf;
  394. ret = spi_device_polling_transmit(*(spi_device_handle_t *)(spi_dev->user_data), &t);
  395. recv_buf += SOC_SPI_MAXIMUM_BUFFER_SIZE ;
  396. length -= SOC_SPI_MAXIMUM_BUFFER_SIZE ;
  397. }
  398. else {
  399. if (is_full_duplex) {
  400. t.length = length * 8;
  401. }
  402. t.rxlength = length * 8;
  403. t.rx_buffer = recv_buf;
  404. ret = spi_device_polling_transmit(*(spi_device_handle_t *)(spi_dev->user_data), &t);
  405. break;
  406. }
  407. }
  408. if (spi_dev->spi_config.cs != 255)
  409. luat_gpio_set(spi_dev->spi_config.cs, LUAT_SPI_CS_CLEAR);
  410. return ret == 0 ? transmit_length : -1;
  411. }
  412. int luat_spi_device_send(luat_spi_device_t *spi_dev, const char *send_buf, size_t length){
  413. if (spi_dev->spi_config.cs != 255)
  414. luat_gpio_set(spi_dev->spi_config.cs, LUAT_SPI_CS_SELECT);
  415. spi_transaction_t t = {0};
  416. esp_err_t ret = -1;
  417. size_t transmit_length = length;
  418. int bus_id = spi_dev->bus_id;
  419. #if defined(CONFIG_IDF_TARGET_ESP32)||defined(CONFIG_IDF_TARGET_ESP32S2)||defined(CONFIG_IDF_TARGET_ESP32S3)
  420. if (bus_id > 3 || bus_id < 2){
  421. return -1;
  422. }
  423. #else
  424. if (bus_id != 2){
  425. return -1;
  426. }
  427. #endif
  428. char tmpbuff[SOC_SPI_MAXIMUM_BUFFER_SIZE];
  429. bool is_full_duplex = spi_dev->spi_config.mode;
  430. while (length > 0) {
  431. memset(&t, 0, sizeof(t));
  432. if (is_full_duplex) {
  433. t.rx_buffer = tmpbuff;
  434. memset(tmpbuff, 0xff, SOC_SPI_MAXIMUM_BUFFER_SIZE);
  435. }
  436. if (length > SOC_SPI_MAXIMUM_BUFFER_SIZE ) {
  437. t.length = SOC_SPI_MAXIMUM_BUFFER_SIZE * 8;
  438. t.tx_buffer = send_buf;
  439. if (is_full_duplex) {
  440. t.rxlength = SOC_SPI_MAXIMUM_BUFFER_SIZE * 8;
  441. }
  442. ret = spi_device_polling_transmit(*(spi_device_handle_t *)(spi_dev->user_data), &t);
  443. send_buf += SOC_SPI_MAXIMUM_BUFFER_SIZE ;
  444. length -= SOC_SPI_MAXIMUM_BUFFER_SIZE ;
  445. }else {
  446. t.length = length * 8;
  447. t.tx_buffer = send_buf;
  448. if (is_full_duplex) {
  449. t.rxlength = length * 8;
  450. }
  451. ret = spi_device_polling_transmit(*(spi_device_handle_t *)(spi_dev->user_data), &t);
  452. break;
  453. }
  454. }
  455. if (spi_dev->spi_config.cs != 255)
  456. luat_gpio_set(spi_dev->spi_config.cs, LUAT_SPI_CS_CLEAR);
  457. return ret == 0 ? transmit_length : -1;
  458. }
  459. int luat_spi_device_config(luat_spi_device_t* spi_dev){
  460. return 0;
  461. }
  462. int luat_spi_config_dma(int spi_id, uint32_t tx_channel, uint32_t rx_channel) {
  463. return 0;
  464. }
  465. int luat_spi_change_speed(int spi_id, uint32_t speed) {
  466. int ret = 0;
  467. spi_device_interface_config_t* dev_config = &spi_config[spi_id-2];
  468. dev_config->clock_speed_hz = speed;
  469. if (spi_handle[spi_id-2]) {
  470. ret = spi_bus_remove_device(spi_handle[spi_id-2]);
  471. // spi_handle[spi_id-2] = NULL;
  472. }
  473. ret = spi_bus_add_device(spi_id-1, dev_config, &spi_handle[spi_id-2]);
  474. return ret;
  475. // return 0;
  476. }
  477. #ifdef LUAT_USE_FATFS
  478. #include "ff.h"
  479. #include "diskio.h"
  480. void luat_spi_set_sdhc_ctrl(block_disk_t *disk) {
  481. }
  482. void luat_sdio_set_sdhc_ctrl(block_disk_t *disk) {
  483. }
  484. #endif