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.

[参考译文] TMS320F28027:不能同时使用 I2C 和 SPI 总线、但这两种总线在单独使用时都能正常工作

Guru**** 2589275 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/777380/tms320f28027-cannot-use-i2c-and-spi-buses-together-but-both-work-fine-when-used-separately

器件型号:TMS320F28027
我正在尝试在项目上使用 I2C 和 SPI 总线。 

问题是、当我尝试同时使用这两个代码块时、取消注释每个相应的代码块、SPI 和 I2C 不能正常工作。

当注释掉另一个块时、这两个块都能完美工作。 我使用 SPI 总线对 DAC 和 PGA 进行编程、并使用 I2C 总线对一组 LED 进行编程。

我将粘贴下面的相关代码。 例如、标记为"error:Hangked here"的代码在 SPI 块也被编译时会一直等待 ACK、但在注释掉 SPI 代码时始终有效。

我意识到很难根据代码片段提出建议、但是否有人知道我应该在哪里寻找问题? 该程序正在闪存中运行、我将时间关键型函数复制到 RAM 中。

//使用 I2C 总线。 如果未编译 SPI、则正常工作。

void set_LEDs (uint16 slave_addr、uint16 ON_OFF)
{
int i;
I2caRegs.I2CSAR =从器件地址;
I2caRegs.I2CMDR.ALL = 0x4620; //自由,MST,TRX,IRS
I2caRegs.I2CCNT = LEN_ON_MSG;
I2caRegs.I2CMDR.bit.STT = 1; //开始条件
I2caRegs.I2CMDR.bit.STP= 1; // CNT=0时将生成停止条件
如果(ON_OFF = ON)
{
对于(i=0;i 'd'="5" (see="" sprufz9d.pdf)="" produces="" at="" 300="" khz,="" 50%="" duty="" cycle.="" i2caregs.i2cpsc.all="5;" 60="" (ipsc+1)="10" i2caregs.i2cclkl="3;" iccl+d="6" i2caregs.i2cclkh="3;" icch+d="6" clk_enablei2cclock(myclk);="" i2caregs.i2csar="TLC59116_SLAVE_ADDR_60;" i2caregs.i2cmdr.bit.irs="1;" enable="" (i2caregs.i2cmdr.bit.stp="" !="0);" return;="" spi="" works="" fine="" if="" is="" not="" compiled="" in.="" spi_init()="" clk_enablespiaclock(myclk);="" spi_resetchannels(myspi);="" spi_setcharlength(myspi,="" spi_charlength_16_bits);="" spi_setmode(myspi,="" spi_mode_master);="" spi_setbaudrate(myspi,="" spi_baudrate_500_kbaud);="" spi_setpriority(myspi,="" spi_priority_freerun);="" spi_enablechannels(myspi);="" spi_disableloopback(myspi);="" spi_enabletx(myspi);="" spi_settriwire(myspi,="" spi_triwire_threewire);="" spi_setclkphase(myspi,="" spi_clkphase_delayed);="" spi_setclkpolarity(myspi,="" spi_clkpolarity_outputrisingedge_inputfallingedge);="" spi_enable(myspi);="" spi_fifo_init(void)="" spi_enablefifoenh(myspi);="" spi_resettxfifo(myspi);="" spi_cleartxfifoint(myspi);="" 

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

    我忘记了包含 GPIO 初始化。

    // GPIO 初始
    化 void GPIO_init (void)
    {
    //将 GPIO 12 (J2/引脚3)设置为输出、以便在示波器上进行调试。
    GPIO_setMode (myGpio、GPIO_Number_12、GPIO_0_Mode_generalpurpose);
    GPIO_setDirection (myGpio、GPIO_Number_12、GPIO_Direction_Output);
    
    //设置 GPIO 28和29以与串行 I/O 配合使用
    GPIO_setPullUp (myGpio、GPIO_Number_28、GPIO_PULLUP_Enable);
    GPIO_setPullUp (myGpio、GPIO_Number_29、GPIO_PULLUP_Disable);
    GPIO_setQualification (myGpio、GPIO_Number_28、GPIO_Qual_异 步);
    GPIO_setMode (myGpio、GPIO_Number_28、GPIO_28_Mode_SCIRXDA);
    GPIO_setMode (myGpio、GPIO_Number_29、GPIO_29_Mode_SCITXDA);
    
    //设置 GPIO 32和33供 I2C 使用。
    GPIO_setPullUp (myGpio、GPIO_Number_32、GPIO_PULLUP_Enable);
    GPIO_setPullUp (myGpio、GPIO_Number_33、GPIO_PULLUP_Enable);
    GPIO_setQualification (myGpio、GPIO_Number_32、GPIO_Qual_异 步);
    GPIO_setQualification (myGpio、GPIO_Number_33、GPIO_Qual_异 步);
    GPIO_setMode (myGpio、GPIO_Number_32、GPIO_32_Mode_SDAA);
    GPIO_setMode (myGpio、GPIO_Number_33、GPIO_33_Mode_SCLA);
    
    //为 SPI 设置 GPIO 6、7、16、17、18。
    GPIO_setPullUp (myGpio、GPIO_Number_16、GPIO_PULLUP_Enable);
    GPIO_setPullUp (myGpio、GPIO_Number_17、GPIO_PULLUP_Enable);
    GPIO_setPullUp (myGpio、GPIO_Number_18、GPIO_PULLUP_Enable);
    GPIO_setQualification (myGpio、GPIO_Number_16、GPIO_Qual_异 步);
    GPIO_setQualification (myGpio、GPIO_Number_17、GPIO_Qual_异 步);
    GPIO_setQualification (myGpio、GPIO_Number_18、GPIO_Qual_异 步);
    GPIO_setMode (myGpio、GPIO_Number_16、GPIO_16_Mode_SPISIMOA);
    GPIO_setMode (myGpio、GPIO_Number_17、GPIO_17_Mode_SPISOMIA);
    GPIO_setMode (myGpio、GPIO_Number_18、GPIO_18_Mode_SPICLKA);
    
    //设置 GPIO 6和7用作 PGA (6)和 DAC (7)的片选。
    GPIO_setDirection (myGpio、GPIO_Number_6、GPIO_Direction_Output);
    GPIO_setMode (myGpio、GPIO_Number_6、GPIO_6_Mode_generalpurpose);
    GPIO_setDirection (myGpio、GPIO_Number_7、GPIO_Direction_Output);
    GPIO_setMode (myGpio、GPIO_Number_7、GPIO_7_Mode_generalpurpose);
    GPIO_setPullUp (myGpio、GPIO_Number_6、GPIO_PULLUP_Disable);
    GPIO_setPullUp (myGpio、GPIO_Number_7、GPIO_PULLUP_Disable);
    
    GPIO_setHigh (myGpio、GPIO_Number_6);
    GPIO_setHigh (myGpio、GPIO_Number_7);
    } 

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

    如果您只从 RAM 运行(假设您有可用的存储器)、它们是否都能正常工作? 您能不能更多地分享您在 SPI 端拥有的功能、您所拥有的就是初始化函数。

    您能否确认 I2caRegs.I2CDXR 寄存器已成功写入、以便 while 环路中断。 如果可能、您可以探测 I2C 和 SPI 信号以查看在任一总线上是否有任何活动。

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

    Kevin 在下面举例说明了访问 SPI 的代码:

    void DAC_program (void)
    {
    //第一个输出字节包含位13和12中的位 GA 和 SHDN,第二个输出字节包含位11-0中的输出值。
    GPIO_setLow (myGpio、GPIO_Number_7);//为此器件选择芯片
    SPI_WRITE (mySpi、(0x3F<8)| 0xFFF);
    DELAY_US (100);
    GPIO_setHigh (myGpio、GPIO_Number_7);
    } 

    我们的硬件工程师告诉我、他必须切断 Launchpad 上的布线才能使 SPI 和 I2C 同时工作、即 JP5/JP6/JP8/JP10。  我正在等待他在修改电路板前是否可以运行我的代码。

    -- Mike

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

    尊敬的 Mike:

    您无需"剪切"任何布线即可使 I2C/SPI 在此板上同时工作。 可能会在 JP4-JP11上造成意外短路、因为在 Launchpad 上、您需要填充0欧姆电阻器或创建一个焊接桥来访问 GPIO 16、17、32或33。 您的电路板需要进行修改、请参阅以下内容:

    最棒的

    Kevin

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

    很抱歉,你是对的。

    您需要切断一些布线才能使 SPI 和 I2C 正常工作。 信号对连接在跳线对和接头引脚之间。

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

    在完成固件更改后、我将把电路板发运给我们的硬件工程师、他将切断这些迹线并进行其他一些小的修复。

    然后、我将有机会尝试两条总线同时工作。

    谢谢。

    -- Mike