您好!
我尝试在两个 TMS320F28335微控制器之间进行通信。 一个配置为主器件、另一个配置为从器件。
当我从主器件向从器件发送数据时、我会按预期从器件返回两个字节的数据。 然后、我得到两个字节的数据、这不是预期的那样。 我从主器件发送到从器件的数据似乎只是存储在 SPIDAT 中、并随着主器件到从器件的下一次数据传输而移出。
相反、我希望从器件将下一个数据从 TXBUF 写入 SPIDAT、并在下一次通信时发送该数据。
随附的内容发送通信屏幕截图以及主从配置代码。 通道1是主器件、通道2是从器件。
提前感谢!
主配置:
int16 init_pins_as spi_master (uint16波特率){ EALLOW; TMC_BASE_PIO->CTL[0].PUD &=~((UINT32) 0x1<<16); //在 GPIO16 (SPISIMOA) 上启用上拉 TMC_BASE_PIO->CTL[0].QSEL2 |=(0x3); //异步输入 GPIO16 (SPISIMOA) TMC_BAS_PIO->CTL[0].MUX2 |=(0x1); //将 GPIO16配置为 SPISIMOA TMC_BASE_PIO->CTL[0].PUD &=~((UINT32) 0x1<<17); //启用 GPIO17 (SPISOMIA) TMC_BASE_PIO->CTL[0].QSEL2 |=(0x3<<2); //异步输入 GPIO17 (SPISOMA) TMC_BAS_PIO->CTL[0].MUX2 |=(0x1<<2); //将 GPIO17配置为 SPISOMIA TMC_BASE_PIO->CTL[0].PUD &=~((UINT32) 0x1<<18); GPIO18上的//使能上拉电阻(SPICLKA) TMC_BASE_PIO->CTL[0].QSEL2 |=((uint32) 0x3<<4); //异步输入 GPIO18 (SPICLKA) TMC_BASE_PIO->CTL[0].MUX2 |=((uint32) 0x1<<4); //将 GPIO18配置为 SPICLKA TMC_BASE_PIO->CTL[0].PUD &=~((UINT32) 0x1<<19); GPIO19上的//使能上拉电阻(SPISTEA) TMC_BASE_PIO->CTL[0].QSEL2 |=((uint32) 0x3<<6); //异步输入 GPIO19 (SPISTEA) TMC_BASE_PIO->CTL[0].MUX2 |=((uint32) 0x1<<6); //将 GPIO19配置为 SPISTEA EDIS; //在复位中设置 TMC_BAS_SPIA->CCR &&μ~(0x1<<7); //启用主控模式、正常阶段、启用通话和禁用 SPI int。 TMC_BASE_SPIA->CTL |= 0x0006;//启用主模式和传输 TMC_BASE_SPIA->BRR |=波特率; TMC_BAS_SPIA->CCR |= 0x00F;// 16位字 //初始化 SPI FIFO 寄存器 TMC_BASE_SPIA->FFRX &=~(0x1F); //接收 TMC_BASE_SPIA->FFRX |=(0x1); //////将 RX FIFO 深度设置为8 TMC_BASE_SPIA->FFRX |=(0x1<<5);//启用中断 TMC_BASE_SPIA->FFRX |=(0x1<<6);//清除中断标志 TMC_BASE_SPIA->FFRX |=(0x1<<13);//重新启用接收 FIFO 操作 TMC_BASE_SPIA->FFTX |=(0x1); //将 TX FIFO 级别设置为8 TMC_BASE_SPIA->FFTX |=(0x1<<5);//启用中断 TMC_BASE_SPIA->FFTX |=(0x1<<6);//清除中断标志 TMC_BASE_SPIA->FFTX |=(0x1<<13);//从复位状态释放 FIFO TMC_BASE_SPIA->FFTX |=(0x1<<14);//启用 FIFO 增强功能 TMC_BASE_SPIA->FFTX |=((uint32) 0x1<<15);// SPI FIFO 恢复 //Out of Reset TMC_BASE_SPIA->CCR |=(0x1<<7);//从复位中撤回 SPI 并设置字符长度 返回0; } uint16 data=0; int main (void) { uint32 i=0; set_system_controls(); INIT_PINS_AS_SPI_MASTER (0x0063); while (1){ SPI_Send (0x8888); SPI_READ (&data); } 返回0; } void SPI_Send (uint16 data){ TMC_BASE_SPIA->TXBUF=数据; TMC_BASE_SPIA->FFTX |=(0x1<<6);//清除中断标志 } void SPI_Read (uint16 *数据){ *数据= TMC_BASE_SPIA->RXBUF; TMC_BASE_SPIA->FFRX |=(0x1<<6);//清除中断标志 }
________________________________________________________________
从器件配置:
int16 init_pins_as spi_slave (){
EALLOW;
TMC_BASE_PIO->CTL[0].PUD &=~((uint32) 0x1<<16); //启用 GPIO16上的上拉(SPISIMOA)
TMC_BASE_PIO->CTL[0].QSEL2 |=(0x3); //异步输入 GPIO16 (SPISIMOA)
TMC_BASE_PIO->CTL[0].MUX2 |=(0x1); //将 GPIO16配置为 SPISIMOA
TMC_BASE_PIO->CTL[0].PUD &=~((uint32) 0x1<<17); //启用 GPIO17上的上拉电阻器(SPISOMIA)
TMC_BASE_PIO->CTL[0].QSEL2 |=(0x3<2); //异步输入 GPIO17 (SPISOMIA)
TMC_BASE_PIO->CTL[0].MUX2 |=(0x1<<2); //将 GPIO17配置为 SPISOMIA
TMC_BASE_PIO->CTL[0].PUD &=~((uint32) 0x1<<18); //启用 GPIO18上的上拉电阻器(SPICLKA)
TMC_BASE_PIO->CTL[0].QSEL2 |=((uint32) 0x3<<4); //异步输入 GPIO18 (SPICLKA)
TMC_BASE_PIO->CTL[0].MUX2 |=((uint32) 0x1<<4); //将 GPIO18配置为 SPICLKA
TMC_BASE_PIO->CTL[0].PUD &=~((uint32) 0x1<<19); //启用 GPIO19上的上拉(SPISTEA)
TMC_BASE_PIO->CTL[0].QSEL2 |=((uint32) 0x3<<6); //异步输入 GPIO19 (SPISTEA)
TMC_BASE_PIO->CTL[0].MUX2 |=((uint32) 0x1<<6); //将 GPIO19配置为 SPISTEA
EDIS;
//在复位中设置
TMC_BAS_SPIA->CCR &&μ~(0x1<<7);
//启用从设备
TMC_BASE_SPIA->CTL &=~(0x0004); //禁用主控模式
TMC_BASE_SPIA->CTL |=(0x2); //启用传输
TMC_BASE_SPIA->CTL |=(0x1); //启用中断
TMC_BAS_SPIA->CCR |= 0x00F; // 16位字
//初始化 SPI FIFO 寄存器
TMC_BASE_SPIA->FFRX &=~(0x1F); //接收
TMC_BASE_SPIA->FFRX |=(0x1); ////将 RX FIFO 级别设置为8
TMC_BASE_SPIA->FFRX |=(0x1<<5); //启用中断
TMC_BASE_SPIA->FFRX |=(0x1<<6); //清除中断标志
TMC_BASE_SPIA->FFRX |=(0x1<<13); //重新启用接收 FIFO 操作
TMC_BASE_SPIA->FFTX |=(0x1); //将 TX FIFO 级别设置为8
TMC_BASE_SPIA->FFTX |=(0x1<<5); //启用中断
TMC_BASE_SPIA->FFTX |=(0x1<<6); //清除中断标志
TMC_BASE_SPIA->FFTX |=(0x1<<13); //从复位状态释放 FIFO
TMC_BASE_SPIA->FFTX |=(0x1<<14); //启用 FIFO 增强功能
TMC_BASE_SPIA->FFTX |=((uint32) 0x1<<15); // SPI FIFO 恢复
//Out of Reset
TMC_BASE_SPIA->CCR |= 0x0080; //从复位中撤回 SPI 并设置字符长度
返回0;
}
void SPI_SET_Interrupt_TX (void * spiTxFIFOISR){
//配置中断
Dint;
EALLOW;
TMC_BASE_INT_regs->SPITXINTA =(uint32) spitxFIFOISR;
EDIS;
TMC_BASE_PIE -> CTRL |= 0x01; //启用 PIE 块
TMC_BASE_PIE ->组[5].IER |= 0x2; //在 PIE 中启用 I2cInt1A:组6中断2
IER |= 0x0020;
EINT;
}
void SPI_SET_Interrupt_RX (void * spiRxFIFOISR){
//配置中断
Dint;
EALLOW;
TMC_BASE_INT_regs->SPIRXINTA =(uint32) spirxFIFOISR;
EDIS;
TMC_BASE_PIE -> CTRL |= 0x01; //启用 PIE 块
TMC_BASE_PIE ->组[5].IER |= 0x1; //在 PIE 中启用 I2cInt1A:组6中断1
IER |= 0x0020;
EINT;
}
void interrupt_ack_SPI (){
//确认中断以从所有中断组中获取更多信息
TMC_BASE_PIE -> ACK |= 0xFFFF;
}
_interrupt void spiRxFIFOISR (void);
_interrupt void spiTxFIFOISR (void);
uint16 z=0;
uint16 data=0x0000;
int main (空)
{
uint32 i=0;
set_system_controls();
init_pins_as spi_slave ();
SPI_SET_Interrupt_RX (&spiRxFIFOISR);
SPI_SET_Interrupt_TX (&spiRxFIFOISR);
while (1){
}
返回0;
}
_interrupt void spiRxFIFOISR (void){
spi_read (&z);
interrupt_ack_SPI ();
}
_interrupt void spiTxFIFOISR (void){
SPI_Send (data);
interrupt_ack_SPI ();
}