TC397使用EB配置实现串口I2C通信详解
1. 工具说明
MCU:TC397
EB: 26.2.0 (AS440)
2. 目标
使用P15.5和P15.4配置成IIC功能,访问MCP79411。
通过串口打印出读取到MCP79411的数据。
3. 准备知识
3.1 I2C模块
网络上对I2C介绍已经非常多了,我这里就不再复述了。
这里介绍一下几个概念:
同步通信:一方发送,另一方应答,否则不进行下一次传输(带时钟同步信号传输)。
异步通信:一方发送,不考虑另一方是否收到,直接进行下一次传输(不带时钟同步信号)。
我这里使用同步传输。
3.2引脚配置
如下图所示,我们P15.4和P15.5 配置成输出复用功能ALT6。
4. EB配置
4.1 时钟配置
Mcu->McuClockSettingConfig
4.2 Port口设置
P15.4和P15.5 的配置如下
4.3 I2C 配置
I2C->I2cChannelConfiguration
I2cSDASelect:I2C数据信号线的引脚选择
I2cSCLSelect :I2C时钟信号线的引脚选择
I2cSpeed : 外部设备数据传输速度的模式选择
(STANDARD_MODE:20kbit/s-100kbit/s;FAST_MODE:100kbit/s-400kbit/s;HIGH_SPEED_MODE:<= 3.4Mb/s)
I2cAddressingMode : 寻址模式(7位/10位)
I2cAsyncNotification :是否启用回调函数;
I2cPacketEndNotification :回调函数名称;
I2cTxTimeOut : 写操作的超时时间;
I2cRxTimeOut :读操作的超时时间;
4.4 中断配置
这里目前不使用中断触发,不过可以了解一下中断配置的界面。
5 .代码示例
包含的头文件:
#include "BSW_I2C.h"
#include "I2c.h"
#include "IfxSrc_reg.h"
#include "Bsw_Uart.h"
#include "IfxI2c_reg.h"
#include "I2c.h"
初始化代码:
void BSW_I2c_init(void)
{
SRC_I2C0DTR.B.SRE = 1;
SRC_I2C0ERR.B.SRE = 1;
SRC_I2C0P.B.SRE = 1;
I2c_Init(&I2c_Config);
}
读取外设MCP79411代码:
uint8 i2cTxBuffer = 0xF2;
uint8 g_macAddr[6] = {0, 0, 0, 0, 0, 0};
void I2c_read_register(uint16 addr,uint16 reg, uint8 *buffer )
{
I2c_ErrorType ret;
ret = I2c_SyncWrite(0, &buffer[0], 1, addr);
if(ret == I2C_NO_ERR)
{
I2c_SyncRead(0,&g_macAddr[0],6,addr);
}
Debug_printf("g_macAddr is %x %x %x %x %x %x\r\n",g_macAddr[0],g_macAddr[1],g_macAddr[2],g_macAddr[3],g_macAddr[4],g_macAddr[5]);
}
I2c_read_register(0x57,0xF2,&i2cTxBuffer);
5.2 I2C 接口测试
使用EB配置生成的I2C,在调用I2c_SyncWrite接口的时候并没有看到停止位。如果外设对时序要求很高的情况下,读取外设设备,需要在I2c_SyncWrite后手动添加停止位再读I2c_SyncRead。
下面展示一下我手动修改的代码:
void Clear_Stop_Bit()
{
Ifx_I2C * P;
P = &MODULE_I2C0;
if(P->RUNCTRL.B.RUN == 0)
{
P->ADDRCFG.B.SONA = 0;
P->ADDRCFG.B.SOPE = 0;
}
}
void Set_Stop_Bit()
{
Ifx_I2C * P;
P = &MODULE_I2C0;
if(P->RUNCTRL.B.RUN == 0)
{
P->ADDRCFG.B.SONA = 1;
P->ADDRCFG.B.SOPE = 1;
}
}
void I2c_read_register(uint16 addr,uint16 reg, uint8 *buffer )
{
I2c_ErrorType ret;
Clear_Stop_Bit();
ret = I2c_SyncWrite(0, &buffer[0], 1, addr);
Set_Stop_Bit();
if(ret == I2C_NO_ERR)
{
I2c_SyncRead(0,&g_macAddr[0],6,addr);
}
Debug_printf("g_macAddr is %x %x %x %x %x %x\r\n",g_macAddr[0],g_macAddr[1],g_macAddr[2],g_macAddr[3],g_macAddr[4],g_macAddr[5]);
}
作者:nrt_ding