如何在QCC300x上实现I2C功能

本文主要介绍如何在qcc300x上实现i2c功能,只在空白工程上实现相关功能。所用的adk版本为adk_qcc300x.win.1.0.167。
此方法理论上同样适用于csr8670/csr8675。
本文实现的功能很简单,通过对iic设备发起一个读写操作,从设备有ack即可。因为如果实现了这个基本操作,后续的其他复杂操作就是怎么写代码的问题了。
将数据0x1234写入到芯片的寄存器0x06和0x07中:
从寄存器0x06和0x07中读取:
这里先讲一下硬件,本次测试用的是官方的开发板,在开发板的p00和p01口上挂了一颗ic--tca9555,它是一颗io扩展芯片,iic接口,所以,本次测试正好使用这颗芯片作为测试。
qcc300x的iic默认配置为p00和p01,当然它也可以改成其他io:
首先,建立一个空白工程,然后工程属性中有个地方需要改一下:
改transport的原因是因为我们使用p00和p01作为i2c的接口,如果使用其他io口,这个应该就不用改了。
然后,我们先烧录一下程序,这样它会擦除flash并对flash进行分区,然后再用pstool merge一下默认的psr程序(这个请参考之前文档)。然后用pstool改以下配置:
将i2c configuration改为“1”的目的是将iic的速率切换到400khz。
下面两个参数是配置i2c接口所对应的io口的:
这些配置完毕后,保存pskey,然后,开始编写我们的代码。
代码也很简单,就一个main.c文档,代码内容如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define message_tx_data 0x4000
#define message_rx_data 0x4001
#define i2c_device_address (0x20<> 8) & 0xff;
i2c_data[2] = data & 0xff;
/*
i2ctransfer(uint16 address, const uint8 *tx, uint16tx_len, uint8 *rx, uint16 rx_len)
if tx_len is non-zero and rx_len is zero then the sequencereduces to:
- start condition (s).
- write slave address and direction byte (address | 0).
- write tx_len data bytes from the buffer at tx.
- stop condition (p).
*/
/*i2ctransfer(device_address, i2c_data, 3, null, 0);*/
paniczero(i2ctransfer(device_address, i2c_data, 3, null,0));
}
void i2c_read_16bit_device_register(uint8 device_address,uint8 device_register, uint16 *data)
{
uint8 i2c_data[1];
uint8 i2c_rx_data[2];
i2c_data[0] = device_register;
/*
i2ctransfer(uint16 address, const uint8 *tx, uint16tx_len, uint8 *rx, uint16 rx_len)
if tx_len is non-zero and rx_len is non-zero then thesequence is:
- start condition (s).
- write slave address and direction byte (address | 0).
- write tx_len data bytes from the buffer at tx.
- repeated start condition (sr).
- write slave address and direction byte (address | 1).
- read rx_len bytes into the buffer at rx, acknowledgingall but the final byte.
- stop condition (p).
*/
/*i2ctransfer(device_address, i2c_data, 1, i2c_rx_data,2);*/
paniczero(i2ctransfer(device_address, i2c_data, 1,i2c_rx_data, 2));
*data = (i2c_rx_data[0] <> 8) & 0xff;
i2c_data[2] = data & 0xff;
2.读:
i2c_data[0]= device_register;
i2ctransfer(device_address,i2c_data, 1, i2c_rx_data, 2);
*data = (i2c_rx_data[0] << 8) + i2c_rx_data[1];
以上代码是从device_register位置读取两个字节的标准操作。
更多操作的话,可以参考前面提到的api说明。
最后,编译运行,就能得到文章一开始的结果了。


2022年我国覆铜板行业调查解析 (上)
蜂蜜检测仪是什么,它的产品性能怎么样
5G时代移动边缘计算让工业物联网如虎添翼
m3芯片和a17的区别
Lucence计划在明年实现一款用于早期癌症诊断的激光成像仪的商用化
如何在QCC300x上实现I2C功能
到2020年,采用LCD屏下指纹的手机出货量将超过1.5亿部
自动化立体库是什么,有哪些功能特点
锂离子电池完全充电的电路图
升压变压器的主要作用
数字电压表的固有误差由什么构成
回顾2018新能源汽车市场取得的成绩和存在的问题
OpenHarmony富设备移植指南(1)导言
双摄手机销量排行榜:前十名华为占八席
毫米级的位移检测,实现可靠智能门锁
用于跟踪粗糙木材的新型RFID短钉标签
让MEMS传感器大放异彩的四大应用领域详解
NVMe硬盘提速《永劫无间》,致钛PC005评测
未来城市的交通和新能源车的发展新思路全面分析
5G共建共享超预期,实现“1+1》2”效应