还有一个问题I/O口怎么模拟SPI进行通讯
void send_command(unsigned int command)
{
unsigned char i;
unsigned int temp;
temp=command;
for(i=0;i<16;i++)
{
SCLK_1;
if(temp&0x8000)
SDATA_1;
if(!(temp&0x8000))
SDATA_0;
SCLK_0;
temp=temp<<1;
}
SCLK_1;
}
小编可以研究一下我写的这段程序,其中DATA_1或DATA_0是某个I/O口输出高电平还是低电平,这就包含了要发送的数据信息。而SCLK_1或SCLK_0是时钟信号,根据数据接收端是上升沿接收数据还是下降沿接收数据用I/O口模拟出上升或下降沿。望采纳。祝小编成功
谢谢,我去研究研究
if(temp&0x8000)这个是什么意思?0X8000代表什么?求层主解释
额……我用的MCU是16位的,所以是0X****,而不是0X**。if(temp&0X8000)这句话是为了检测temp变量的最高位是0还是1,如果是1,那么if判断语句为真,就会发送高电平数据;如果最高位是0,那么if判断语句为假,转而执行else语句,发送低电平数据。因为是16位数据,所以temp每次左移一位共需左移16次才能把一个完整的数据发送完成,这就是for循环语句中16的来源。
需要注意的是这段程序是以数据高位先发送为准则的,如果要先发送低位,那么if语句要改成if(temp&0X01),数据左移也要改成右移。
谢谢我感觉我SPI时序图有点没搞懂的
嗯。你得先看明白时序图。还有就是数据发送速率不要超过接收器件的最高通信速率。
通信速率是怎么设定的?通过定义无线的寄存器吗?
看你的MCU工作时钟频率多高了,,用I/O口模拟SPI通信的话不存在设置寄存器这一说。
晶振是11.0592的,
不错,可以看看
如果你是学51单片机的话不用考虑速率问题。
不错。