|
在论坛找了一圈没发现有何帖子跟我这现象类似的。现在不知道是哪配置出错了还是有啥我没注意的事项,想来求救于各位大神了!!!
我遇到的问题是:
1.使用8A8K64D4作为SPI从机。
2.主机设置的是SPI模式3,即时钟空闲电平为高电平,在上升沿采集数据,下降沿输出数据。
3.主程序里跑的是空循环,在SPI中断程序里只对SPDAT进行取值,不赋值。(采集和输出寄存器都是SPDAT寄存器)
这样SPI主机对单片机发啥,在下个数据时钟周期内,单片机应该就会回复啥。
4.程序运行之后发现8A8K64D4在输出的时候,是在时钟信号上升沿刚过大约不到0.1us开始跳变的(感觉像是设置成上升沿输出下降沿采集了),正常的应该在下降沿进行跳变,在上升沿进行采集。
这个图是整体发送和接收通过逻辑分析仪得出来的电平
这个图是把前两个数据放大后的。图中可以看到MOSI引脚先输出了0x50,在下一个数据的时候MISO回复了0X50。但是问题就出现在这,MOSI的引脚是在下降沿跳变上升沿采集的,而MISO引脚不放大的话看起来像是上升沿跳变下降沿采集(与MOSI引脚不同)
放大之后可知大约上升沿之后0.1us MISO引脚发生改变(正常情况应该在下降沿的时候才改变)
想问下各位大神,我是哪配置错了或者是有哪疏忽了?
使用单片机型号:STC8A8K64D4
SPI空闲电平为高电平,在上升沿采集数据,下降沿输出数据。
SPI设置为:
void SPI_config(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_Config(0x12, GPIO_PullUp);
GPIO_Config(0x13, GPIO_PullUp);
GPIO_Config(0x14, GPIO_OUT_PP);
GPIO_Config(0x15, GPIO_PullUp);
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_High; //时钟相位 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_1); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
SPI_SW(SPI_P12_P13_P14_P15); //SPI_P12_P13_P14_P15,SPI_P22_P23_P24_P25,SPI_P74_P75_P76_P77,SPI_P35_P34_P33_P32
SPI_SS = 1;
}
void SPI_ISR_Handler() interrupt SPI_VECTOR
{
if(SPCTL & 0x10) //主机模式
{
B_SPI_Busy = 0;
}
else //从机模式
{
if(SPI_RxCnt >= SPI_BUF_LENTH) SPI_RxCnt = 0;
SPI_RxBuffer[SPI_RxCnt++] = SPDAT;
SPI_RxTimerOut = 5;
}
SPSTAT = SPIF + WCOL; //清0 SPIF和WCOL标志
}
|
|