SPI使用实例

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

  1. #include"hdf_log.h"
  2. #include"spi_if.h"
  3. voidSpiTestSample(void)
  4. {
  5. int32_t ret;
  6. structSpiCfg cfg;/* SPI配置信息 */
  7. structSpiDevInfo spiDevinfo;/* SPI设备描述符 */
  8. structDevHandle*spiHandle = NULL;/* SPI设备句柄 */
  9. structSpiMsg 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. }