SPI使用实例

SPI设备完整的使用示例如下所示,首先获取SPI设备句柄,然后配置SPI设备属性,接着调用读写接口进行数据传输,最后销毁SPI设备句柄。


1. #include "hdf_log.h"
2. #include "spi_if.h"

4. void SpiTestSample(void)
5. {
6. int32_t ret;
7. struct SpiCfg cfg;                  /* SPI配置信息 */
8. struct SpiDevInfo spiDevinfo;       /* SPI设备描述符 */
9. struct DevHandle *spiHandle = NULL; /* SPI设备句柄 */
10. struct SpiMsg msg;                  /* 自定义传输的消息 */
11. uint8_t rbuff[4] = { 0 };
12. uint8_t wbuff[4] = { 0x12, 0x34, 0x56, 0x78 };
13. uint8_t wbuff2[4] = { 0xa1, 0xb2, 0xc3, 0xd4 };

15. spiDevinfo.busNum = 0;              /* SPI设备总线号 */
16. spiDevinfo.csNum = 0;               /* SPI设备片选号 */
17. spiHandle = SpiOpen(&spiDevinfo);   /* 根据spiDevinfo获取SPI设备句柄 */
18. if (spiHandle == NULL) {
19. HDF_LOGE("SpiOpen: failed\n");
20. return;
21. }
22. /* 获取SPI设备属性 */
23. ret = SpiGetCfg(spiHandle, &cfg);
24. if (ret != 0) {
25. HDF_LOGE("SpiGetCfg: failed, ret %d\n", ret);
26. goto err;
27. }
28. cfg.maxSpeedHz = 115200;                /* 将最大时钟频率改为115200 */
29. cfg.bitsPerWord = 8;                    /* 传输位宽改为8比特 */
30. /* 配置SPI设备属性 */
31. ret = SpiSetCfg(spiHandle, &cfg);
32. if (ret != 0) {
33. HDF_LOGE("SpiSetCfg: failed, ret %d\n", ret);
34. goto err;
35. }
36. /* 向SPI设备写入指定长度的数据 */
37. ret = SpiWrite(spiHandle, wbuff, 4);
38. if (ret != 0) {
39. HDF_LOGE("SpiWrite: failed, ret %d\n", ret);
40. goto err;
41. }
42. /* 从SPI设备读取指定长度的数据 */
43. ret = SpiRead(spiHandle, rbuff, 4);
44. if (ret != 0) {
45. HDF_LOGE("SpiRead: failed, ret %d\n", ret);
46. goto err;
47. }
48. msg.wbuf = wbuff2;  /* 写入的数据 */
49. msg.rbuf = rbuff;   /* 读取的数据 */
50. msg.len = 4;        /* 读取写入数据的长度为4 */
51. msg.csChange = 1;   /* 进行下一次传输前关闭片选 */
52. msg.delayUs = 0;    /* 进行下一次传输前不进行延时 */
53. msg.speed = 115200; /* 本次传输的速度 */
54. /* 进行一次自定义传输,传输的msg个数为1 */
55. ret = SpiTransfer(spiHandle, &msg, 1);
56. if (ret != 0) {
57. HDF_LOGE("SpiTransfer: failed, ret %d\n", ret);
58. goto err;
59. }
60. err:
61. /* 销毁SPI设备句柄 */
62. SpiClose(spiHandle);
63. }