嵌入式开发者社区
标题:
C6748 SPI1与 Cortex-A5 通信问题
[打印本页]
作者:
泽1997126
时间:
2022-3-22 20:18
标题:
C6748 SPI1与 Cortex-A5 通信问题
Cortex-A5 作为主机 DSP作为从机 , 现在的情况就两个 1是DSP收到的数 只有前几个是正确的 从第五个数第六个数往后就乱了 不知道是什么问题 2是 收发数太多程序就会卡死 卡在接收判断的时候while( (HWREG(SOC_SPI_1_REGS + SPI_SPIBUF) & 0x80000000 ) ); 但是数少的时候就可以 。 感谢各位大佬
作者:
泽1997126
时间:
2022-3-22 20:22
/****************************************************************************/
/* */
/* 主函数 */
/* */
/****************************************************************************/
int main(void)
{
// 外设使能配置
PSCInit();
// 管脚复用配置
GPIOBankPinMuxSet();
// GPIO 管脚初始化
GPIOBankPinInit();
//参数初始化
paramater_init();
// 初始化串口终端 使用串口2
UARTStdioInit();
UARTPuts("SPI1_A9 Test by Zzc......\r\n", -1);
// 定时器 / 计数器初始化
TimerInit();
// DSP 中断初始化
InterruptInit();
// 定时器 / 计数器中断初始化
TimerInterruptInit();
// SPI 中断初始化
//SPIInterruptInit();
// SPI 初始化
SPIInit();
while(1)
{
//Delay(1000);
if(testj==1000)
{
//与A9SPI传输
ToA9_SPI_Transfer();
GPIOPinWrite(SOC_GPIO_0_REGS, 6, Flag); // D6 亮 GPIO0[5]
Flag=!Flag;
GPIOPinWrite(SOC_GPIO_0_REGS, 6, Flag);
}
//UARTprintf("SPI_A9[%d] = %d\r\n", 10,rx_data[10]);//GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_LOW);
}
}
void ToA9_SPI_Transfer(void)
{
//p_tx = &tx_data[0];
//p_tx = (uint8_t*)tx_data;
//p_rx = (uint8_t*)rx_data;
//p_rx = &rx_data[0];
testi++;
testj=0;
if(testi == A9_DSP.averge)
{
TimerDisable(SOC_TMR_2_REGS, TMR_TIMER12);
TimerIntDisable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
if(ModeFlag() == 0)
{
for(k=0;k<10;k++)
{
tx_data[k]=k;//校验
}
for(k=10;k<4013;k++)
{
tx_data[k]=3;
//tx_data[k]=data_buff[k];
}
for(k = 4013; k < 4023; k++)
{
tx_data[k]=0;
}
Delay(1000);
SPI1_Communicate((uint8_t*)tx_data, rx_data, 4023);
GPIOPinWrite(SOC_GPIO_0_REGS, 9, GPIO_PIN_LOW); //GPIO0[8]向A9发送低电平
GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_LOW);
}
// memset(tx_data, 0, size1 * sizeof(uint32_t)); //清空tx_data
// memset(Data_TX_Buff, 0, SIZE3 * sizeof(uint32_t));
// memset(rx_data, 0, size2 * sizeof(uint8_t)); //清空rx_data
testi=0;
// 定时器 / 计数器初始化
TimerInit();
TimerInterruptInit();
}
}
void SPI1_Communicate(uint8_t * sp2TxBuffer, uint8_t * sp2RxBuffer, int NumByteToRead)
{
NumByteToRead++;
while (--NumByteToRead)
{
while( HWREG(SOC_SPI_1_REGS + SPI_SPIBUF) & (0x20000000));
SPITransmitData1(SOC_SPI_1_REGS, *sp2TxBuffer);
sp2TxBuffer++;
//UARTprintf("%d\r\n",1);
if(NumByteToRead == 4023)
{
GPIOPinWrite(SOC_GPIO_0_REGS, 9, GPIO_PIN_HIGH); //GPIO0[8]向A9发送高电平
GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_HIGH);
//UARTprintf("%d\r\n",2);
}
else
{
//UARTprintf("%d\r\n",3);
while( (HWREG(SOC_SPI_1_REGS + SPI_SPIBUF) & 0x80000000 ) );
//UARTprintf("%d\r\n",5);
*sp2RxBuffer = SPIDataReceive(SOC_SPI_1_REGS);
sp2RxBuffer++;
// UARTprintf("%d\r\n",4);
}
if(NumByteToRead == 1)
{
while( (HWREG(SOC_SPI_1_REGS + SPI_SPIBUF) & 0x80000000 ) );
*sp2RxBuffer = SPIDataReceive(SOC_SPI_1_REGS);
sp2RxBuffer++;
}
}
}
void SPIInit(void)
{
unsigned char cs = 0x01;
unsigned char dcs = 0x01;
unsigned int val = SIMO_SOMI_CLK_CS;
SPIReset(SOC_SPI_1_REGS);//复位
SPIOutOfReset(SOC_SPI_1_REGS);//取消复位
SPIModeConfigure(SOC_SPI_1_REGS, SPI_SLAVE_MODE);// 主/从模式选择
SPIClkConfigure(SOC_SPI_1_REGS, 228000000, 10000000, SPI_DATA_FORMAT0); //配置时钟
SPIPinControl(SOC_SPI_1_REGS, 0, 0, &val);// 使能 SIMO SOMI CLK 引脚
SPIDefaultCSSet(SOC_SPI_1_REGS, dcs);//设置CS3空闲时为高电平
// 配置 SPI 数据格式
SPIDataFormatConfig(SPI_DATA_FORMAT0);
// 配置 SPI 数据格式及片选信号
SPIDat1Config(SOC_SPI_1_REGS, (SPI_CSHOLD | SPI_DATA_FORMAT0), cs);
// 映射中断到 INT1
//SPIIntLevelSet(SOC_SPI_1_REGS, SPI_RECV_INTLVL | SPI_TRANSMIT_INTLVL);
// 使能 SPI
SPIEnable(SOC_SPI_1_REGS);
// 配置管脚为输出状态
//GPIODirModeSet(SOC_GPIO_0_REGS, 111, GPIO_DIR_OUTPUT); // GPIO6[14]
}
作者:
泽1997126
时间:
2022-3-23 11:12
有大佬知道 缓冲区TXBUF 和RXBUF是多大吗 没有找到相关的说明
作者:
创龙科技support
时间:
2022-3-24 16:52
您好,这边按照官方的回复,可在TMS320C6748 Fixed- and Floating-Point DSP datasheet (Rev. G).pdf查看到为16bit的buffer,不支持修改[attach]6986[/attach]
欢迎光临 嵌入式开发者社区 (https://51dsp.net/)
Powered by Discuz! X3.4