1、简介
MAX32662EVKIT的IIC通信是使用官方库来实现,这些IIC库函数是比较有特色的,其他如SPI、CAN通信库也是如此。一方面将通信外设的参数配置、数据写入读取函数全部封装到mxc_i2c_req_t结构体中,方便用户调用。
2、IIC外设初始化
这里选取SHT20温度传感器进行IIC通信测试。SHT20的通信原理可以查阅其数据手册说明,这里就不特别介绍了,仅提供在这个评估板上的驱动源程序
main.h头文件内容
#ifndef __MAIN_H #define __MAIN_H #include <stdio.h> #include <stdint.h> #include "string.h" #include "mxc_device.h" #include "led.h" #include "board.h" #include "mxc_delay.h" #include "gpio.h" #include "i2c.h" #endif
main.c文件关于硬件IIC的初始化内容
#define I2C_MASTER MXC_I2C1 ///< I2C instance #define I2C_FREQ 100000 ///< I2C clock frequency /***** Globals *****/ static mxc_i2c_req_t req; ///< I2C request uint8_t txBuff[3]; uint8_t txLen=3; uint8_t rxBuff[3]; uint8_t rxLen=3; /***** Functions *****/ void IIC_HardWare_Init(){ int error = E_NO_ERROR; error = MXC_I2C_Init(I2C_MASTER, 1, 0); MXC_I2C_SetFrequency(I2C_MASTER, I2C_FREQ); } static int i2c_transfer(mxc_i2c_req_t *req, uint8_t *txData, int txSize, uint8_t *rxData,int rxSize){ req->tx_buf = txData; // Write data buffer req->tx_len = txSize; // Number of bytes to write req->rx_buf = rxData; // Read data buffer req->rx_len = rxSize; // Number of bytes to read return MXC_I2C_MasterTransaction(req); } static int i2c_write(mxc_i2c_req_t *req, uint8_t *txData, int txSize){ return i2c_transfer(req, txData, txSize, NULL, 0); // Create I2C write request } static int i2c_read(mxc_i2c_req_t *req, uint8_t *txData, uint8_t *rxData, int rxSize){ return i2c_transfer(req, txData, 1, rxData, rxSize); // Create I2C read request }
SHT20读取温度数据程序,可以看到温度传感器的程序非常简洁,这是因为美信提供了硬件IIC的通信库函数。如果使用软件IIC方式,至少还得写一长段的软件IIC程序
float Measure_Data_Conversion(uint8_t Buffer[]){ float Temperature = 0.00f; Temperature = 175.72f * (float)((Buffer[0]<<8) | Buffer[1]) / 65536 - 46.85f; return (float)Temperature; } void TempMeasure(){ req.i2c = I2C_MASTER; req.addr = 0x40; //SHT20地址 req.tx_buf = NULL; req.tx_len = 0; req.rx_buf = NULL; req.rx_len = 0; req.restart = 0; req.callback = NULL; uint8_t txCMD=0xE3;//温度读取指令 }
测试代码
int main(void){ TempMeasure(); while (1) { i2c_read(&req,&txCMD,rxBuff,3); printf("Temp:%0.2f C\n",(float)Measure_Data_Conversion(rxBuff)); MXC_Delay(500000); } }
3、运行结果
从评估板电路原理图得到,MXC_I2C1外设的通信接口为P06、P09
将SHT20的SCL接入评估板P06引脚,SDA接入P09引脚,温度测量结果如下所示