SPI使用实例

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

  1. #include "hdf_log.h"
  2. #include "spi_if.h"
  3. void SpiTestSample(void)
  4. {
  5. int32_t ret;
  6. struct SpiCfg cfg; /* SPI配置信息 */
  7. struct SpiDevInfo spiDevinfo; /* SPI设备描述符 */
  8. struct DevHandle *spiHandle = NULL; /* SPI设备句柄 */
  9. struct SpiMsg msg; /* 自定义传输的消息 */
  10. uint8_t rbuff[4] = { 0 };
  11. uint8_t wbuff[4] = { 0x12, 0x34, 0x56, 0x78 };
  12. uint8_t wbuff2[4] = { 0xa1, 0xb2, 0xc3, 0xd4 };
  13. spiDevinfo.busNum = 0; /* SPI设备总线号 */
  14. spiDevinfo.csNum = 0; /* SPI设备片选号 */
  15. spiHandle = SpiOpen(&spiDevinfo); /* 根据spiDevinfo获取SPI设备句柄 */
  16. if (spiHandle == NULL) {
  17. HDF_LOGE("SpiOpen: failed\n");
  18. return;
  19. }
  20. /* 获取SPI设备属性 */
  21. ret = SpiGetCfg(spiHandle, &cfg);
  22. if (ret != 0) {
  23. HDF_LOGE("SpiGetCfg: failed, ret %d\n", ret);
  24. goto err;
  25. }
  26. cfg.maxSpeedHz = 115200; /* 将最大时钟频率改为115200 */
  27. cfg.bitsPerWord = 8; /* 传输位宽改为8比特 */
  28. /* 配置SPI设备属性 */
  29. ret = SpiSetCfg(spiHandle, &cfg);
  30. if (ret != 0) {
  31. HDF_LOGE("SpiSetCfg: failed, ret %d\n", ret);
  32. goto err;
  33. }
  34. /* 向SPI设备写入指定长度的数据 */
  35. ret = SpiWrite(spiHandle, wbuff, 4);
  36. if (ret != 0) {
  37. HDF_LOGE("SpiWrite: failed, ret %d\n", ret);
  38. goto err;
  39. }
  40. /* 从SPI设备读取指定长度的数据 */
  41. ret = SpiRead(spiHandle, rbuff, 4);
  42. if (ret != 0) {
  43. HDF_LOGE("SpiRead: failed, ret %d\n", ret);
  44. goto err;
  45. }
  46. msg.wbuf = wbuff2; /* 写入的数据 */
  47. msg.rbuf = rbuff; /* 读取的数据 */
  48. msg.len = 4; /* 读取写入数据的长度为4 */
  49. msg.csChange = 1; /* 进行下一次传输前关闭片选 */
  50. msg.delayUs = 0; /* 进行下一次传输前不进行延时 */
  51. msg.speed = 115200; /* 本次传输的速度 */
  52. /* 进行一次自定义传输,传输的msg个数为1 */
  53. ret = SpiTransfer(spiHandle, &msg, 1);
  54. if (ret != 0) {
  55. HDF_LOGE("SpiTransfer: failed, ret %d\n", ret);
  56. goto err;
  57. }
  58. err:
  59. /* 销毁SPI设备句柄 */
  60. SpiClose(spiHandle);
  61. }