- 打卡等级:初来乍到
- 打卡总天数:2
- 最近打卡:2025-04-24 14:32:54
已绑定手机
新手上路
- 积分
- 17
|
两个单片机SPI都使用的P32,P33,P34,P35四个IO口,串口都用的uart1(P30,P31),主频都是22.1184MHz:
8G1K08配置如下:
void SPI_PS_init(void)
{
SPI_InitTypeDef SPI_InitStructure;
COMx_InitDefine COMx_InitStructure; //结构定义
COMx_InitStructure.UART_Mode = UART_8bit_BRTx; //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
COMx_InitStructure.UART_BRT_Use = BRT_Timer1; //选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
COMx_InitStructure.UART_BaudRate = 115200ul; //波特率, 一般 110 ~ 115200
COMx_InitStructure.UART_RxEnable = ENABLE; //接收允许, ENABLE或DISABLE
COMx_InitStructure.BaudRateDouble = DISABLE; //波特率加倍, ENABLE或DISABLE
UART_Configuration(UART1, &COMx_InitStructure); //初始化串口1 UART1,UART2,UART3,UART4
NVIC_UART1_Init(ENABLE,Priority_1); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
SPI_InitStructure.SPI_Enable = ENABLE; //SPI启动 ENABLE, DISABLE
SPI_InitStructure.SPI_SSIG = DISABLE; //片选位 ENABLE, DISABLE
SPI_InitStructure.SPI_FirstBit = SPI_MSB; //移位方向 SPI_MSB, SPI_LSB
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave; //主从选择 SPI_Mode_Master, SPI_Mode_Slave
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //时钟相位 SPI_CPOL_High, SPI_CPOL_Low
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //数据边沿 SPI_CPHA_1Edge, SPI_CPHA_2Edge
SPI_InitStructure.SPI_Speed = SPI_Speed_4; //SPI速度 SPI_Speed_4, SPI_Speed_8, SPI_Speed_16, SPI_Speed_2/SPI_Speed_32
SPI_Init(&SPI_InitStructure);
NVIC_SPI_Init(ENABLE,Priority_3); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
P3_MODE_IO_PU(GPIO_Pin_All);
SPI_SW(SPI_P35_P34_P33_P32);
SPI_SS_4 = 1;
}
void Sample_SPI_PS(void)
{
u8 i;
if(COM1.RX_TimeOut > 0)
{
if(--COM1.RX_TimeOut == 0)
{
if(COM1.RX_Cnt > 0)
{
UartReceived = 1; //设置串口接收标志
}
}
}
if((UartReceived) && (SPI_SS_4))
{
SPI_SetMode(SPI_Mode_Master);
SPI_SS_4 = 0; //拉低从机 SS 管脚
delay_ms(1);
for(i=0;i<COM1.RX_Cnt;i++)
{
SPI_WriteByte(RX1_Buffer); //发送串口数据
}
SPI_SS_4 = 1; //拉高从机的 SS 管脚
SPI_SetMode(SPI_Mode_Slave);
COM1.RX_Cnt = 0;
UartReceived = 0;
}
if(SPI_RxTimerOut > 0)
{
if(--SPI_RxTimerOut == 0)
{
printf("spi[%d]:",SPI_RxCnt);
if(SPI_RxCnt > 0)
{
for(i=0; i<SPI_RxCnt; i++) TX1_write2buff(SPI_RxBuffer);
}
SPI_RxCnt = 0;
}
}
}
STC32G12K128配置如下:
/**************** SPI初始化函数 *****************/
void SPI_config(void)
{
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Enable = ENABLE; //SPI启动 ENABLE, DISABLE
SPI_InitStructure.SPI_SSIG = DISABLE; //片选位 ENABLE, DISABLE
SPI_InitStructure.SPI_FirstBit = SPI_MSB; //移位方向 SPI_MSB, SPI_LSB
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave; //主从选择 SPI_Mode_Master, SPI_Mode_Slave
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //时钟相位 SPI_CPOL_High, SPI_CPOL_Low
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //数据边沿 SPI_CPHA_1Edge, SPI_CPHA_2Edge
SPI_InitStructure.SPI_Speed = SPI_Speed_4; //SPI速度 SPI_Speed_4, SPI_Speed_16, SPI_Speed_64, SPI_Speed_128
SPI_Init(&SPI_InitStructure);
NVIC_SPI_Init(ENABLE,Priority_3); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
P3_MODE_IO_PU(GPIO_Pin_All);
SPI_SW(SPI_P35_P34_P33_P32); //SPI_P54_P13_P14_P15,SPI_P22_P23_P24_P25,SPI_P54_P40_P41_P43,SPI_P35_P34_P33_P32
SPI_SS_4 = 1;
}
/**********************************************/
void main(void)
{
u8 i;
u16 cnt=0;
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXSFR(); //扩展SFR(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
GPIO_config();
UART_config();
SPI_config();
EA = 1;
printf("STC32G_SPI_TEST\r\n"); //UART发送一个字符串
while (1)
{
delay_ms(1);
if(cnt++%250==0) P46 = !P46;
if(COM1.RX_TimeOut > 0)
{
if(--COM1.RX_TimeOut == 0)
{
if(COM1.RX_Cnt > 0)
{
UartReceived = 1; ////设置串口接收标志
}
}
}
if((UartReceived) && (SPI_SS_4))
{
SPI_SetMode(SPI_Mode_Master); //SPI设置主机模式,开始发送数据
SPI_SS_4 = 0; //拉低从机 SS 管脚
delay_ms(1);
for(i=0;i<COM1.RX_Cnt;i++)
{
SPI_WriteByte(RX1_Buffer); //发送串口数据
}
SPI_SS_4 = 1; //拉高从机的 SS 管脚
SPI_SetMode(SPI_Mode_Slave); //SPI设置从机模式,进入接收状态
COM1.RX_Cnt = 0;
UartReceived = 0;
}
if(SPI_RxTimerOut > 0)
{
if(--SPI_RxTimerOut == 0) //SPI超时计数器每1ms减1,并判断是否为0
{
printf("SPI[%d]",SPI_RxCnt);
if(SPI_RxCnt > 0) //SPI接收超时后判断SPI接收数据长度是否非零
{
for(i=0; i<SPI_RxCnt; i++) TX1_write2buff(SPI_RxBuffer); //通过串口输出数据
}
SPI_RxCnt = 0; //清除SPI已接收数据长度
}
}
}
}
有没有大佬帮忙分析一下无法通讯的原因呀?
|
|