大家好、
我已经尝试实现基本的 SPI 单字符读取/写入、但没有完全成功。 如有必要、我可以提供更多详细信息、但让我从基础知识开始、我们将了解我是否可以发现我的错误。
设置: 我使用 USB 转 SPI 转换器(MCP2210)将 SPI 通道上的字符发送到 MCU 从设备。 在固件中、在接收中断时、我读取输入、然后写入一个字符(无论我在调试观察窗口中分配了什么值)。 无 FIFO 缓冲器。 所有多路复用器均已正确开启。 中断代码为:
_interrupt spiRxIsr (void) { SpicRegs.SPIFFRX.bit.RXFFOVFCLR=1;//清除溢出标志 SpicRegs.SPIFFRX.bit.RXFFINTCLR=1;//清除中断标志 PieCtrlRegs.PIEACK.ALL |= M_6;SPICRxINTCLR=1;//清除中断标志 PieCtrl.SpicRegs.SpicData = 16 ;/SpiData Spintrintru.SpiCR.SpiData = 16;/SpiData = SpinTIDRxInTIDRxData = 16;/SpinTIDTIDRxData = SpiCR.SpiCR.SpiCR.TID
因此、读取的值和写入的值(以及在我的 PC 上读取的值)的结果都是奇数的。 每次读取后、SPIDAT 寄存器似乎不会被完全清空、因此我写入的值会继续逐位移位。 它是不一致的、并且在几个读取/写入周期中、读取和发送的数据是正确的。 让我知道我是否遗漏了某个东西、或者应该尝试一些具体的东西。 我花了一段时间、尝试了许多组合、但没有看到任何改进。
下面是我的初始化代码:
//
// InitSPI -此函数将 SPI 初始化为已知状态
//
void SPI_InitSpiC (void)
{
//初始化 SPI-C
//在配置更改之前将 RESET 设置为低电平
//时钟极性(0 =上升、1 =下降)
// 8位字符
//禁用环回
SpicRegs.SPICCR.bit.SPISWRESET = 0;
SpicRegs.SPICCR.bit.CLKPOLARITY = 0;
SpicRegs.SPICCR.bit.SPICHAR =(7);//8位转换
SpicRegs.SPICCR.bit.SPILBK = 0;
//启用主设备(0 =从设备,1 =主设备)
//启用传输(TALK)
//时钟相位(0 =正常、1 =延迟)
//启用 SPI 中断
SpicRegs.SPICTL.bit.MASTER_SLAVE = 0;
SpicRegs.SPICTL.bit.TALK = 1;
SpicRegs.SPICTL.bit.CLK_PHASE = 1;
SpicRegs.SPICTL.bit.SPIINTENA=1;
//在断点上停止不会停止 SPI
SpicRegs.SPIPRI.bit.FREE = 1;
//解除 SPI 复位
SpicRegs.SPICCR.bit.SPISWRESET = 1;
}
//
// InitSpicGpio -初始化*** GPIO
//
void SPI_InitSpiCGpio()
{
EALLOW;
//
//为所选引脚启用内部上拉
//
//用户可以启用或禁用上拉。
//这将启用指定引脚的上拉电阻。
//注释掉其他不需要的行。
//
GpioCtrlRegs.GPCPUD.bit.GPIO69 = 0;//启用上拉
GpioCtrlRegs.GPCPUD.bit.GPIO70=0;
GpioCtrlRegs.GPCPUD.bit.GPIO71 = 0;
//
//仅将所选引脚的限定条件设置为异步
//
//这将为所选引脚选择异步(无限定条件)。
//注释掉其他不需要的行。
//
GpioCtrlRegs.GPCQSEL1.bit.GPIO69 = 3;//异步输入
GpioCtrlRegs.GPCQSEL1.bit.GPIO70 = 3;
GpioCtrlRegs.GPCQSEL1.bit.GPIO71 = 3;
//
//使用 GPIO 寄存器配置 SPI-A 引脚
//
//这指定哪些可能的 GPIO 引脚将是 SPI 功能
//引脚。
//注释掉其他不需要的行。
//
//G-Mux
GpioCtrlRegs.GPCGMUX1.bit.GPIO69 = 3;// MOSI
GpioCtrlRegs.GPCGMUX1.bit.GPIO70 = 3;// MISO
GpioCtrlRegs.GPCGMUX1.bit.GPIO71 = 3;// SCLK
//多路复用器
GpioCtrlRegs.GPCMUX1.bit.GPIO69 = 3;// MOSI
GpioCtrlRegs.GPCMUX1.bit.GPIO70 = 3;// MISO
GpioCtrlRegs.GPCMUX1.bit.GPIO71 = 3;// SCLK
EDIS;
}