This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] LAUNCHXL-F2.8027万F:I2C从属通信

Guru**** 2044370 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/578738/launchxl-f28027f-i2c-slave-communication

部件号:LAUNCHTXL-F2.8027万F

我正在尝试通过i2c与Raspberry Pi通信,而我的2.8027万在CCS 7中充当从属接收器。 当我最终测试它是否在工作时

//等待总线忙测试 
while ( I2caRegs.I2CSTR.bit.BB !=1); 

while循环永不退出。 我正在使用Raspberry Pi实用程序i2cdetect来ping i2c总线上的所有地址,我可以看到它实际上是在使用数字示波器执行此操作。

 我已尝试在RAM和闪存中运行以下软件,每个都没有错误。 在函数i2c_init()中,我对i2ca寄存器进行了所有配置,但在调试器中,所有i2ca寄存器都是0x'd,好像调试器无法读取它们或者它们从未被修改过一样。

系统:Ubuntu 16.10

CCS版本:7.0 .0.0.0043万

#include "F2802x_headers/include/F2802x_Device.h"
#include2802#include "F2802x_common/include/F2802x_examples.h"

#include2802#include "F2802x_common/include/clk.h"
#include "F280gpia_common/cpu_my280l"#include

"pi_my_pid/pog_myl/pare_myk/f280l"#include "f280l/pi_my_pid_my_pare/pi_pare/pare_myk/f280l_my_pare/pare/pare_myk/pi_myk/pi_pid/pare_myk/f280l"#include "f280l_pi_pi_pi_pi_pi_pi_pi_pi_pare/pi_pare/pare.









gPIO_HANDLE myGpio;

void setup_handles(){
myClk = CLK_INIT ((void *) CLK_BASE ADDR,sizeof (CLK_Obj));
myCpu = CPU_INIT ((void *) NULL,sizeof (CPU_Obj));
myPie = PIE_INIT ((void *) PIE_base_ADDR,sizeof (PIE_Obj));
myPll = PLL_INIT ((void *) PLL_base_ADDR,sizeof (PLL_Obj));
myWDog = WDOG_INIT ((void *) WDOG_base_ADDR,sizeof (WDOG_Obj));
myGpio = gPIO_init((void *) gPIO_base_ADDR, sizeof(GPIO_Obj));
}

void init_system(){
//从闪存运行-将基于RAM的功能复制到RAM
#ifdef _flash
memcpy (&RamfuncsRunStart,&RamfuncsLoadStart,(size_t)&RamfuncsLoadSize);
#endif

//禁用看门狗
WDOG_DISABLE (myWDog);

//加载出厂校准
clk_enableAdcClock(myClk);
(*Device_cal )();
clk_disableAdcClock(myClk);

//选择内部振荡器1 (10 MHz)作为时钟源
CLK_setOscSrc (myClk,CLK_OscSrc_Internal);

//将PLL设置为10 MHz * 12 / 2 = 60 MHz
PLL_setup (myPll,PLL_Multiplier_12,PLL_DivideSelect_CLKIN_BY_2);

//禁用PIE和所有中断
PIE_DISABLE (myPie);
PIE_DisableAllInts(myPie);
CPU_disableGlobalInts (myCpu);
cpu_clearIntFlags(myCpu);
}

void main(){
Setup_Handles();
init_system();

GPIO设置上拉(myGpio,GPIO编号_32,GPIO _上拉_启用);
GPIO设置上拉(myGpio,GPIO编号_33,GPIO _上拉_启用);

GPIO_setQualification (myGpio,gPIO_NUMBER_32,gPIO_Qual_Async);
GPIO_setQualification (myGpio,GPIO编号_33,GPIO _Qual_Async);

GPIO设置模式(myGpio,GPIO编号_32,GPIO _32_Mode_SDAA);
GPIO设置模式(myGpio,GPIO编号_33,GPIO 33模式_SCLA);

clk_enableSciaClock(myClk);

I2C_INIT();

//等待总线忙测试
while ( I2caRegs.I2CSTR.bit.BB !=1);

//在总线上等待自己的从属设备
//while( I2caRegs.I2CSTR.bit.AAS !=1);



同时(1)
;}


void i2c_init(void){

// i2c配置重置模式
I2caRegs.I2CMDR.bit.IRS = 0;

//模块时钟预缩放器
I2caRegs.I2CPsc.all = 5;// 60MHz /({5}+ 1)= 10MHz (i2c需要7-12 MHz)

//主时钟
I2caRegs.I2CCLKL = 120;
I2caRegs.I2CCLKH = 120;

//解除i2c的复位
I2caRegs.I2CMDR.bit.IRS = 1;


//=== I2C模式寄存器(I2CMDR)===

// nack模式
//仅在接收器时考虑
I2caRegs.I2CMDR.bit.NACKMOD = 0;

//自由数据模式
I2caRegs.I2CMDR.bit.free = 1;//从属模式需要

//启动(STT)条件位模式
//仅在主时考虑
I2caRegs.I2CMDR.bit.STT = 0;

//停止(STP)条件位模式
//仅在主时考虑
I2caRegs.I2CMDR.bit.stp = 0;

//主(MST)模式位
I2caRegs.I2CMDR.bit.MST = 0;// 0表示从属设备

//发送器(TRX)模式位
I2caRegs.I2CMDR.bit.TRX = 0;// 0表示接收器

//扩展地址位(7位或10位)
I2caRegs.I2CMDR.bit.XA = 0;// 0表示正常的7位地址

//重复模式(RM)位
//仅在主变送器时考虑
I2caRegs.I2CMDR.bit.rm = 0;

//数字回送(DLB)模式位
I2caRegs.I2CMDR.bit.DLB = 0;

// I2C模块重置位
//用于默认所有I2CSTR位
//配置时钟预分频和保持时间时需要
//*可以重置I2CMDR寄存器?

//标准字节模式(STB)
//仅在主时考虑
I2caRegs.I2CMDR.bit.STB = 0;

//自由数据格式(FDF)位
I2caRegs.I2CMDR.bit.FDF = 0;// 0表示7/10位寻址格式

//位数位
I2caRegs.I2CMDR.bit.BC = 000;//每字节8位

//=== I2CMDR的结束===


//自己的地址
I2caRegs.I2COAR = 0x0048;

//读取1个字节
I2caRegs.I2CCNT =1;

}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    I2C模块的时钟是否已启用? 确保PCLKCR0的位4为1。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    弥敦道
    您的问题是否已解决?