This action will force synchronization from OpenHarmony/docs, which will overwrite any changes that you have made since you forked the repository, and can not be recovered!!!
Synchronous operation will process in the background and will refresh the page when finishing processing. Please be patient.
使用SPI的一般流程如图1所示。
在使用SPI进行通信时,首先要调用SpiOpen获取SPI设备句柄,该函数会返回指定总线号和片选号的SPI设备句柄。
struct DevHandle *SpiOpen(const struct SpiDevInfo *info);
表 1 SpiOpen参数和返回值描述
假设系统中的SPI设备总线号为0,片选号为0,获取该SPI设备句柄的示例如下:
struct SpiDevInfo spiDevinfo; /* SPI设备描述符 */
struct DevHandle *spiHandle = NULL; /* SPI设备句柄*/
spiDevinfo.busNum = 0; /* SPI设备总线号 */
spiDevinfo.csNum = 0; /* SPI设备片选号 */
/* 获取SPI设备句柄 */
spiHandle = SpiOpen(&spiDevinfo);
if (spiHandle == NULL) {
HDF_LOGE("SpiOpen: failed\n");
return;
}
在获取到SPI设备句柄之后,需要配置SPI设备属性。配置SPI设备属性之前,可以先获取SPI设备属性,获取SPI设备属性的函数如下所示:
int32_t SpiGetCfg(struct DevHandle *handle, struct SpiCfg *cfg);
表 2 SpiGetCfg参数和返回值描述
int32_t ret;
struct SpiCfg cfg = {0}; /* SPI配置信息*/
ret = SpiGetCfg(spiHandle, &cfg); /* 配置SPI设备属性 */
if (ret != 0) {
HDF_LOGE("SpiGetCfg: failed, ret %d\n", ret);
}
在获取到SPI设备句柄之后,需要配置SPI设备属性,配置SPI设备属性的函数如下所示:
int32_t SpiSetCfg(struct DevHandle *handle, struct SpiCfg *cfg);
表 3 SpiSetCfg参数和返回值描述
int32_t ret;
struct SpiCfg cfg = {0}; /* SPI配置信息*/
cfg.mode = SPI_MODE_LOOP; /* 以回环模式进行通信 */
cfg.transferMode = PAL_SPI_POLLING_TRANSFER; /* 以轮询的方式进行通信 */
cfg.maxSpeedHz = 115200; /* 最大传输频率 */
cfg.bitsPerWord = 8; /* 读写位宽为8个比特 */
ret = SpiSetCfg(spiHandle, &cfg); /* 配置SPI设备属性 */
if (ret != 0) {
HDF_LOGE("SpiSetCfg: failed, ret %d\n", ret);
}
如果只向SPI设备写一次数据,则可以通过以下函数完成:
int32_t SpiWrite(struct DevHandle *handle, uint8_t *buf, uint32_t len);
表 4 SpiWrite参数和返回值描述
int32_t ret;
uint8_t wbuff[4] = {0x12, 0x34, 0x56, 0x78};
/* 向SPI设备写入指定长度的数据 */
ret = SpiWrite(spiHandle, wbuff, 4);
if (ret != 0) {
HDF_LOGE("SpiWrite: failed, ret %d\n", ret);
}
如果只读取一次数据,则可以通过以下函数完成:
int32_t SpiRead(struct DevHandle *handle, uint8_t *buf, uint32_t len);
表 5 SpiRead参数和返回值描述
int32_t ret;
uint8_t rbuff[4] = {0};
/* 从SPI设备读取指定长度的数据 */
ret = SpiRead(spiHandle, rbuff, 4);
if (ret != 0) {
HDF_LOGE("SpiRead: failed, ret %d\n", ret);
}
如果需要发起一次自定义传输,则可以通过以下函数完成:
int32_t SpiTransfer(struct DevHandle *handle, struct SpiMsg *msgs, uint32_t count);
表 6 SpiTransfer参数和返回值描述
int32_t ret;
uint8_t wbuff[1] = {0x12};
uint8_t rbuff[1] = {0};
struct SpiMsg msg; /* 自定义传输的消息*/
msg.wbuf = wbuff; /* 写入的数据 */
msg.rbuf = rbuff; /* 读取的数据 */
msg.len = 1; /* 读取、写入数据的长度都是1 */
msg.csChange = 1; /* 进行下一次传输前关闭片选 */
msg.delayUs = 0; /* 进行下一次传输前不进行延时 */
msg.speed = 115200; /* 本次传输的速度 */
/* 进行一次自定义传输,传输的msg个数为1 */
ret = SpiTransfer(spiHandle, &msg, 1);
if (ret != 0) {
HDF_LOGE("SpiTransfer: failed, ret %d\n", ret);
}
SPI通信完成之后,需要销毁SPI设备句柄,销毁SPI设备句柄的函数如下所示:
void SpiClose(struct DevHandle *handle);
该函数会释放掉申请的资源。
表 7 SpiClose参数描述
SpiClose(spiHandle); /* 销毁SPI设备句柄 */
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。