8A8K64D4使用硬件SPI作为从机,MISO引脚电平变化发生在采集跳变沿之后问题
在论坛找了一圈没发现有何帖子跟我这现象类似的。现在不知道是哪配置出错了还是有啥我没注意的事项,想来求救于各位大神了!!!我遇到的问题是:
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 = SPDAT;
SPI_RxTimerOut = 5;
}
SPSTAT = SPIF + WCOL; //清0 SPIF和WCOL标志
}
DebugLab 发表于 2024-12-24 19:00
CPOL设置的为1,CPHA设置的也为1。按理来说应该就是SCLK空闲时间为高电平,然后在上升沿采集数据。可是结果就是我上边发的那样。还是在上升沿附近改变的MISO的电平。 小书童@456 发表于 2024-12-25 09:36
CPOL设置的为1,CPHA设置的也为1。按理来说应该就是SCLK空闲时间为高电平,然后在上升沿采集数据。可是 ...
异常时读出SPCTL看看 DebugLab 发表于 2024-12-25 09:42
异常时读出SPCTL看看
读出来是0x4C 从逻辑分析仪采集的数据来看,主机发什么,下个字节收什么的目的达到了,返回的就是发送的数据:
乘风飞扬 发表于 2024-12-25 14:37
从逻辑分析仪采集的数据来看,主机发什么,下个字节收什么的目的达到了,返回的就是发送的数据:
...
是的,单独看逻辑分析仪的结果是没啥问题,但是仔细观察会发现主机在改变MOSI引脚电平的时候是在时钟信号下降沿的时候,但是单片机回复的时候改变MISO引脚电平是在时钟信号上升沿的时候(放大后可知是在上升沿后大于0.1us)。而设置的是SPI模式3,应该在下降沿的时候改变MISO引脚才对。 我的主机是在上升沿的时候采集数据,由于MOSI在上升沿会改变电平所以导致我的主机得到的消息不对。 乘风飞扬 发表于 2024-12-25 14:37
从逻辑分析仪采集的数据来看,主机发什么,下个字节收什么的目的达到了,返回的就是发送的数据:
...
主机用的什么芯片?如果也是STC芯片的话烧录附件例子到主机与从机板子进行收发试试。 乘风飞扬 发表于 2024-12-25 16:36
主机用的什么芯片?如果也是STC芯片的话烧录附件例子到主机与从机板子进行收发试试。 ...
主机用的NXP 的6ULL 不是单片机是跑LINUX的
页:
[1]
2