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.

[参考译文] TM4C1292NCPDT:I2C-SPI 组合不工作

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1209216/tm4c1292ncpdt-i2c-spi-combined-not-working

器件型号:TM4C1292NCPDT
主题中讨论的其他器件:TM4C123

您好!

我个人的基本 I2C 和 SPI 通信代码正常工作、但当我尝试合并这两者时、无法获取 SPI 时钟和数据(组合后尚未检查 I2C)。

I2C 和 SPI 组合的 main ()函数中的代码片段:

ui32SysClocks = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);
InitConsole();

//初始化 I2C 模块0
InitI2C0 ();

// IOC_DIInit ();

InitSPI();
SSIEnable (SSI0_BASE);

ui8Do_Source_Sink = 0x00;
PDO_Status[0]= true;

aui16SpiTxBuffer[0]= 0;
dataTX[0]=(HB_ENABLE << 0)|(HB_CONFIG << 0);//输出高电平

SysCtlDelay (2000);//delay of

SPI_WRITE (dataTX、1);

InitI2C0()的定义是:

void InitI2C0 (void)

//启用包含 I2C 0的 GPIO 外设
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);

//启用 I2C 模块0
SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);

//重置模块
SysCtlPeripheralReset (SYSCTL_Periph_I2C0);

//为端口 B2和 B3上的 I2C0功能配置引脚多路复用。
GPIOPinConfigure (GPIO_PB2_I2C0SCL);
GPIOPinConfigure (GPIO_PB3_I2C0SDA);

//为这些引脚选择 I2C 功能。
GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);

//启用并初始化 I2C0主机模块。 使用的系统时钟
// I2C0模块。 最后一个参数设置 I2C 数据传输速率。
//如果为 false,则数据速率设置为100kbps,如果为 true,则数据速率为
//设置为400kbps。
//I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、true);//用于400kbps tm4c123
I2CMasterInitExpClk (I2C0_BASE、SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000)、true);//对于400kbps tm4c129

//清除 I2C FIFO
//HWREG (I2C0_BASE + I2C_O_FIFOCTL)= 80008000;
}

IOC_DIInit()的定义:  

void IOC_DIInit (void)

//i2cConfigbus stI2cConfig;
uint8_t aui8txBuffer[24];
uint8_t aui8rxBuffer[24];
uint8_t i;
uint16_t diSourceSink;

diSourceSink = 0x0;
//将 IO 扩展器端口配置为数字输入的输入,然后
//针对拉电流受电方选择的输出
aui8txBuffer[0]= 0x06;
aui8txBuffer[1]= 0x01;//dig 输入0的位1
aui8txBuffer[2]= 0x00;//其他位被设置为包括拉电流/灌电流在内的输出
I2CSend (DI_SLAVEADDRESS、3、0x06、0x01、0);//配置端口0

//将 IO 扩展器端口配置为数字输入的输入,然后
//针对拉电流受电方选择的输出
aui8txBuffer[0]= 0x07;
aui8txBuffer[1]= 0x00;//
aui8txBuffer[2]= 0x00;//其他位被设置为包括拉电流/灌电流在内的输出
I2CSend (DI_SLAVEADDRESS、3、0x07、0x0、0);//配置端口1

SysCtlDelay (100);
/*将拉电流受电方配置写入输出寄存器 port1 */
aui8txBuffer[0]= 0x03;
aui8txBuffer[1]= 0x00;
aui8txBuffer[2]=(diSourceSink << 7)和0x80;//P17 (位15)、用于源受电位

I2CSend(DI_SLAVEADDRESS, 3, aui8txBuffer[0]、aui8txBuffer[1]、aui8txBuffer[2]);//输出 reg 1
}

 InitSPI()的定义:

void InitSPI (void){

SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

GPIOPinTypeGPIOOutput (GPIO_Porta_base、GPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_4);
GPIOPinTypeGPIOInput (GPIO_PORTA_BASE、GPIO_PIN_5);

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOM);
//SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);

GPIOPinTypeGPIOOutput (GPIO_PORTM_BASE、GPIO_PIN_5);
GPIOPadConfigSet (GPIO_PORTM_BASE、GPIO_PIN_5、GPIO_strength_12mA、GPIO_PIN_TYPE_STD_WPU);
GPIOPinWrite (GPIO_PORTM_BASE、GPIO_PIN_5、GPIO_PIN_5);//上拉

//GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_4);
//GPIOPadConfigSet (GPIO_PORTB_BASE、GPIO_PIN_4、GPIO_strength_12mA、GPIO_PIN_TYPE_STD_WPU);
// GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_4、GPIO_PIN_4);//上拉

GPIOPinConfigure (GPIO_PA2_SSI0CLK);
GPIOPinConfigure (GPIO_PA3_SSI0FSS);
GPIOPinConfigure (GPIO_PA4_SSI0XDAT0);//Tx
GPIOPinConfigure (GPIO_PA5_SSI0XDAT1);//rx
GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2);
//SSIConfigSetExpClk (SSI0_BASE、ui32SysClocks、SSI_FRF_MOTO_MODE_2、SSI_MODE_MASTER、40000000、 16);
//SSIConfigSetExpClk (SSI0_BASE、ui32SysClocks、SSI_FRF_MOTO_MODE_0、SSI_MODE_MASTER、1500000、 16);
SSIConfigSetExpClk (SSI0_BASE、ui32SysClocks、SSI_FRF_MOTO_MODE_1、SSI_MODE_MASTER、1500000、 16);//负边沿触发
}

函数  IOC_DIInit()在 main ()中 被注释时的 SPI 波形:

但是当我取消  IOC_DIInit()的注释时,我 不会得到上面的波形。

这些 I2C 和 SPI 函数在单独运行时可以正常运行。

请说明为什么 SPI 通信不应与函数  IOC_DIInit()一起使用,例如在启动 I2C 通信时。

此致、

Kiran

 

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

    您好!

     我在你的代码中看到两个问题、一个次要问题、一个主要问题。

     对于次要问题,在 InitSPI()中您有以下代码。 首先将 PA5/4/3/2配置为 GPIO、然后立即将这些引脚更改为 SSI。 稍后的配置为 SSI 配置这些引脚、将覆盖您首次配置的 GPIO 模式。 请删除 GPIO 配置。

    GPIOPinTypeGPIOOutput (GPIO_Porta_base、GPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_4);
    GPIOPinTypeGPIOInput (GPIO_PORTA_BASE、GPIO_PIN_5);

    GPIOPinConfigure (GPIO_PA2_SSI0CLK);
    GPIOPinConfigure (GPIO_PA3_SSI0FSS);
    GPIOPinConfigure (GPIO_PA4_SSI0XDAT0);//Tx
    GPIOPinConfigure (GPIO_PA5_SSI0XDAT1);//rx
    GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2);

    对于主要问题,我在 InitI2C0 ()和 main ()中看到您的以下代码。 您在 main ()中有以下代码片段。 这种说法很好。 返回值是保存在变量  ui32SysClocks 中的时钟频率。 您应该将 ui32SysClocks 设置为全局变量、以便其他函数可以使用它、例如在 InitI2C0中。  

    ui32SysClocks = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);

    稍后在 InitI2C0()中,调用  I2CMasterInitExpClk 内的 SysCtlClockFreqSet()。 您不应该这样做。 导致时钟再次重新配置。 这可能导致 PLL 完成重新锁定和其他系统任务。 您应该仅使用全局变量 ui32SysClocks 。  

    I2CMasterInitExpClk (I2C0_BASE、SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000)、true);//对于400kbps tm4c129

    相反、您应更改为此选项:

    I2CMasterInitExpClk (I2C0_BASE、ui32SysClocks 、true);//用于400kbps tm4c129