|
本帖最后由 szb314 于 2020-5-1 19:49 编辑
DS1302不用多说,都知道了,算是3线半双工SPI了,度娘了一下,没有人发过STC 15W系列 硬件SPI驱动1302的方法,但是有类似的其它MCU的套路,借鉴了前人的经验图, 菜鸟一个水平有限,欢迎大神指导
改了一下电阻阻值,这个阻值不是唯一,,1K-20K都试过可以,具体多大更好,可以根据实际情况适当调整
刚开始走了坑路,飞线接在了有其它spi器件的板子上,死活没调试成功,后来上示波器一看波形就知道了,IO脚可能被其它器件拉低拉高导致异常,能读到数据才怪
后来直接飞线到最小系统板上,很快就读到正常数据了,,,,毕竟SPI速度要比IO模拟应该要快些,而且节省IO,所以还是有必要发个帖,给后人再挖个坑:lol:
废话不多说了,再贴一些简单代码和图片,,,转载请说明出处,谢谢!
- void InitSPI() //STC 的SPI初始化
- {
- SPDAT = 0; //初始化SPI数据
- SPSTAT = SPIF | WCOL; //清除SPI状态位 0xC0
- SPCTL = 0xF2; // 16分频@24Mhz //1302最大时钟2MHz 要根据实际情况调整SPI 时钟频率
- }
复制代码- //-------------------------DS1302------------------------------//
- //sbit CS4 = P5^3; //1302片选
- sbit CS4 = P1^6;
- sbit CLK = P1^5;
- sbit DI = P1^3;
- ////////////////////////////////
- //1302 SPI分频极限(@24MHz)
- // 4分频波形严重失真 无法读取
- // 8分频 操作16bit 约需8us
- //16分频 操作16bit 约需14us 推荐
- //32分频 操作16bit 约需25us
- u8 DS1302_SPI_READ(u8 cmd) // 约需14us (@24MHz)
- {
- u8 a;
- CS4 = 1; //1302片选
- SPI_Cmd_8bit(cmd); //发送读取命令
- SPI_Cmd_8bit(0x00);//发送8位0 (8个CLK)以便读取数据
- CS4 = 0; //取消片选
- a= SPDAT;
- return a; //返回读取值
- }
- void DS1302_SPI_WRITE(u8 cmd,u8 dat) // 约需14us (@24MHz)
- {
- CS4 = 1; //1302片选
- SPI_Cmd_8bit(cmd); //发送读取命令
- SPI_Cmd_8bit(dat);//发送8位0 (8个CLK)以便读取数据
- CS4 = 0; //取消片选
- }
- void SPI_Cmd_8bit(u8 WR_DAT)
- {
- SPDAT = WR_DAT; // 写入数据
- while (!(SPSTAT & SPIF)); //等待SPI数据传输完成
- SPSTAT = 0xc0; //清除SPI状态
- }
复制代码
再贴几张图,请无视示波器的渣渣解码功能:lol:
8分频
16分频
32分频
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|