主题中讨论的其他器件: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