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.
我正在尝试通过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; }