关于STC32G SPI通信问题。
初始化:void Init_SPI()
{
//P_SW1=0x04;
SPI_S1=0;SPI_S0=1; //将 SPI 调整到 SS P22MOSI P23MISO P24SCLK P25
SPDAT = 0;
SPSTAT=0xc0; //SPDAT.7和SPDAT.6写11,可以将中断标志清零。注意是写1才清零
SPCTL = 0xd0; //SSIG 1 开启主机模式 SPEN 1 SPI使能DORD 0 先发最高位 MSTR 1 主机模式、SPI输入时钟/4
}
uchar SPI_SendByte(uchar SPI_SendData)
{
SPDAT= SPI_SendData; // 将数据 写入
while(!SPIF); //等待写入完成
SPIF = 1; //清除中断标志,和写冲突标志,注意是对应位写1才能清零
returnSPDAT; //返回得到的数据
}
uint SPI_Flash_ReadID(void)
{
uint Temp = 0;
SPI_FLASH_CS=0;
SPI_SendByte(0x90);//发送读取ID命令
SPI_SendByte(0x00); //前8位
SPI_SendByte(0x00);//中8位
SPI_SendByte(0x00); //后8位
Temp|=SPI_SendByte(0xFF)<<8;
Temp|=SPI_SendByte(0xFF);
SPI_FLASH_CS=1;
}
以上是一个SPI命令,24位地址发送。遇到的问题是,通过示波器观察,只收到了16位地址。而同样的程序,在STC8A8K64SA12上是对的。就是消失了一个SPI_SendByte(0x00);
经过尝试,发现如下情况:
SPI_SendByte(0x90);//发送读取ID命令
SPI_SendByte(0x01);
SPI_SendByte(0x02);
SPI_SendByte(0x07);
SPI_SendByte(0x04);
SPI_SendByte(0x90);//发送读取ID命令
SPI_SendByte(0x02);
SPI_SendByte(0x08);
SPI_SendByte(0x05);
SPI_SendByte(0x03);
对比到的PROHEX差异如下(共计2行差异):
:107BC300CA79C2A27490120046740112004674026C
:107BC300CA79C2A274901200467402120046740865
:107BD3001200467407120046740412004674FF1222
:107BD3001200467405120046740312004674FF1225
但是,但是,如果把函数修改为:
SPI_SendByte(0x90);//发送读取ID命令
SPI_SendByte(0x00);
SPI_SendByte(0x00);
SPI_SendByte(0x00);
SPI_SendByte(0x00);
编译的文件再和1274的文件相比较,差异行出现了1576行,已经无法核对编译时这个位置出了什么问题。
即,结论是SPI_SendByte(0x00); 连续发送编译的文件有问题,但找不到问题所在。
https://www.stcaimcu.com/forum.p ... d=323&extra=&page=1
页:
[1]