sbit sck = P1^2;
sbit scs = P1^3;
sbit sdo = P1^0;
sbit sdi = P1^1;int spi_read(unsigned char addr)
{int data;int i;addr&=0x3f; //6位地址 addr|=0x80;//读操作数sdo = 1; sck = 0; sck = 1; // 上升沿发送起始位for(i = 0;i < 8;i++ //发送操作码和6位地址{if(addr&0x80 = 0x80)sdo = 1;elsesdo = 0;sck = 0;sck = 1;addr<<=1;}sck = 1; //下降沿接收空位sck = 0;data=data<<1;for(i = 0;i< 16;i ++) //读取16位数据{sck = 1;_nop_();if(sdi == 1)data |= 0x0001;elsedata |= 0x0000;sck = 0;if(i != 15)//需添加此条件不然,data会移位17次data = data<<1;}return data;
}int spi_write(unsigned char addr,unsigned int data_16)
{int data;int i;uchar op_wden = 0x3f; //写使能uchar op_wddt = 0x0f; //写禁止addr&=0x3f; // 位地址addr|=0x40; //写操作码sdo = 1; //起始位(1)sck = 0;sck = 1; //首先发送1位起始位(1)for(i = 0; i < 8; i ++) //写使能操作{if(op_wden&0x80 == 0x80)sdo = 1;else sdo = 0;sck = 0;sck = 1;op_wden <<=1; }sdo = 1; //起始位(1)sck = 0;sck = 1; //首先发送1位起始位(1)for(i = 0; i < 16;i++){if(data_16&0x80 == 0x80)sdo = 1;elsesdo = 0;sck = 0;sck = 1;data_16 <<= 1;} //写入16位数据sdo = 1; //起始位(1)sck = 0;sck = 1; //首先发送1位起始位(1)for(i = 0; i < 8; i ++) //写禁止操作{if(op_wddt&0x80 == 0x80)sdo = 1;else sdo = 0;sck = 0;sck = 1;op_wddt <<=1;}return 0;}
对于不同的串行接口外围芯片,它们的时钟时序是不同的。上述子程序是针对在SCK的上升沿输入(接收)数据和在下降沿输出(发送)数据的器件。这些子程序也适用于在串行时钟)的上升沿输入和下降沿输出的其它各种串行外围接口芯片,只要在程序中改变P1.2(SCK)的输出电平顺序进行相应调整即可。
本文发布于:2024-02-05 04:29:50,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170724178963047.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |