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.
工具/软件:Code Composer Studio
您好!
我正在尝试写入 SPI 传输函数、以将数据写入 Crystalfontz OFAL1602C OLED。 我无法在示波器的 MOSI 引脚上看到任何输出。 我能够在示波器上完美地观察从器件选择引脚和时钟、但没有 MOSI 输出。 请查看所附图片。
这就是我编写 SPI 传输函数的方式、我在每次传输中传输10位、因为这就是 OLED 驱动器 WS0012在 SPI 模式下运行的方式。
void SPI_Transfer (uint8类型、uint8值)
{
EALLOW;
GpioG1DataRegs.GPADP.bit.GPIO19=0; //启用 LCD 上的低电平有效从器件选择引脚以开始通信
if (data==type) //设置 data (1)/command (0)标志
{
SpiaRegs.SPITXBUF=1; //将 MOSI 设置为高电平
while (SpiaRegs.SPISTS.bit.INT_flag!= 1){}
dummy5 = SpiaRegs.SPIRXBUF;
}
其他
{
SpiaRegs.SPITXBUF=0; //将 MOSI 拉低
while (SpiaRegs.SPISTS.bit.INT_flag!= 1){}
dummy5 = SpiaRegs.SPIRXBUF;
}
//将其计时。
GpioG1DataRegs.GPADD.bit.GPIO18=0;
GpioG1DataRegs.GPADAT.bit.GPIO19=1;
//清除要写入的读取(1)/写入(0)标志
SpiaRegs.SPITXBUF=0; //将 MOSI 拉低,因为您始终要写入 LCD,而不是从 LCD 读取。
while (SpiaRegs.SPISTS.bit.INT_flag!= 1){}
dummy3 = SpiaRegs.SPIRXBUF;
//数据中的时钟
GpioG1DataRegs.GPADD.bit.GPIO18=0;
GpioG1DataRegs.GPADD.bit.GPIO18=1;
for (掩码= 0x80;掩码;掩码>>=1)
{
if (掩码和值)
{
SpiaRegs.SPITXBUF=1; //如果为 true,则将 MOSI 设置为高电平
while (SpiaRegs.SPISTS.bit.INT_flag!= 1){}
dummy4 = SpiaRegs.SPIRXBUF;
}
其他
{
SpiaRegs.SPITXBUF=0; //如果为 false,将 MOSI 拉至低电平
while (SpiaRegs.SPISTS.bit.INT_flag!= 1){}
dummy5 = SpiaRegs.SPIRXBUF;
}
//将其计时
GpioG1DataRegs.GPADD.bit.GPIO18=0;
GpioG1DataRegs.GPADD.bit.GPIO18=1;
}
//禁用低电平有效的从器件选择引脚并结束通信一个周期
GpioG1DataRegs.GPADAT.bit.GPIO19=1;
EDIS;
}
我正在查看 DSP 板上 SPI-A 引脚的示波器输出、并在 SPI-STEA 信号和 SPI-CLK 信号上获得正确的输出。 但我在 MOSI 引脚上看不到任何输出。
我出了什么问题? 我们非常感谢您的任何建议或帮助。 我还在下面添加了 SPI 初始化和配置函数、
空 InitSpi (空)
{
//初始化 SPI-A
//在配置更改之前将 RESET 设置为低电平
//时钟极性(0 =上升、1 =下降)
// 16位字符
//**启用环回
SpiaRegs.SPICCR.bit.SPISWRESET = 0;
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
SpiaRegs.SPICCR.bit.SPICHAR =(10-1);
SpiaRegs.SPICCR.bit.SPILBK = 0;//禁用环回
//启用主设备(0 =从设备,1 =主设备)
//启用传输(TALK)
//时钟相位(0 =正常、1 =延迟)
//禁用 SPI 中断
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;//主模式
SpiaRegs.SPICTL.bit.TALK = 1;//启用传输
SpiaRegs.SPICTL.bit.CLK_PHASE = 0;//时钟相位正常
SpiaRegs.SPICTL.bit.SPIINTENA=0;//禁用 SPI 中断
//设置波特率
SpiaRegs.SPIBRR = SPI_BRR;// SPI 的波特率
//设置空闲位
//在断点上停止不会停止 SPI
SpiaRegs.SPIPRI.bit.FREE = 1;
//解除 SPI 复位
SpiaRegs.SPICCR.bit.SPISWRESET = 1;
}
空 InitSpiaGpio()
{
EALLOW;
/*为所选引脚启用内部上拉*/
//上拉使能应在中设置
// M3代码中的 GPIO_O_PUR 寄存器。
/*将所选引脚的限定条件设置为仅异步*/
//这将为所选引脚选择异步(无限定条件)。
//注释掉其他不需要的行。
GpioCtrlRegs.GPAQSEL2.bit.GPIO16=3;//异步输入 GPIO16 (SPISIMOA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3;//异步输入 GPIO17 (SPISOMIA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3;//异步输入 GPIO18 (SPICLKA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3;//异步输入 GPIO19 (SPISTEA)
// GpioCtrlRegs.GPBQSEL2.bit.GPIO54 = 3;//异步输入 GPIO16 (SPISIMOA)
// GpioCtrlRegs.GPBQSEL2.bit.GPIO55 = 3;//异步输入 GPIO17 (SPISOMIA)
// GpioCtrlRegs.GPBQSEL2.bit.GPIO56 = 3;//异步输入 GPIO18 (SPICLKA)
// GpioCtrlRegs.GPBQSEL2.bit.GPIO57 = 3;//异步输入 GPIO19 (SPISTEA)
/*使用 GPIO 寄存器配置 SPI-A 引脚*/
//这指定哪些可能的 GPIO 引脚将是 SPI 功能引脚。
//注释掉其他不需要的行。
GpioCtrlRegs.GPAMUX2.bit.GPIO16=1;//将 GPIO16配置为 SPISIMOA
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1;//将 GPIO17配置为 SPISOMIA
GpioCtrlRegs.GPAMUX2.bit.GPIO18=1;//将 GPIO18配置为 SPICLKA
GpioCtrlRegs.GPAMUX2.bit.GPIO19=1;//将 GPIO19配置为 SPISTEA
// GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 1;//将 GPIO54配置为 SPISIMOA
// GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 1;//将 GPIO55配置为 SPISOMIA
// GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 1;//将 GPIO56配置为 SPICLKA
// GpioCtrlRegs.GPBMUX2.bit.GPIO57=1;//将 GPIO57配置为 SPISTEA
EDIS;
}
谢谢、
Srini.
您好 Srini、
您检查了 SPITXBUF 是否实际被写入到正确的位置?
此致、
Marlyn