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]);
}

5.3 I2C 波形捕获

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nrt_ding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值