搜索
12
返回列表 发新帖
楼主: xiajintaord

[已解决] (源码)STM32模拟SPI实现不同工作模式的问题

[复制链接]

该用户从未签到

91

主题

4756

帖子

4

蝴蝶豆

论坛元老

最后登录
2021-2-27
发表于 2018-8-11 00:35:06 | 显示全部楼层
楼上大家也说了这么多了,那我给你提供一个参考。
#include<reg52.h>  
//---------------------------------------------------------  
#define uchar unsigned char   
#define SDA   P3_6  
#define SCL   P3_7  
//-----------------------------------------------------------------------  
void delay_100us();  
void delay_1s();  
void i2c_start();  
void i2c_stop();  
void get_ack();  
void i2c_send_byte(uchar mydata);  
void i2c_write_byte(uchar dev_addr_wr,uchar word_addr,uchar mydata);  
uchar i2c_read_byte(uchar dev_addr_wr,uchar dev_addr2_rd,uchar word_addr);  
//------------------------------------------------------------------------  
/*void main()
{
    uchar temp;
    while(1)
    {
        i2c_write_byte(0xa2,0x00,0x00);
        temp=i2c_read_byte(0xa2,0xa3,0x02);
        delay_1s();
        P1= temp;
    }
}*/  
//-----------------------------------------     //here are the functions   
void delay_100us()  
{  
    unsigned char i;  
    for(i=5;i>0;i--)  
        {;}  
}  
//-----------------------------------------  
void delay_1s()  
{  
    unsigned char i,j,k;  
    for(i=100;i>0;i--)  
        for(j=50;j>0;j--)  
            for(k=100;k>0;k--)  
                {;}  
}  
//------------------------------------------  
void i2c_start()  
{  
    SCL=0;  
    delay_100us();  
    SDA=1;                              //a falling edge of sda when scl is high   
    delay_100us();   
    SCL=1;        
    delay_100us();                                                                        
    SDA=0;        
    delay_100us();                                                                        
    SCL=0;                              //keep the SDA and SCL low;  
    delay_100us();                                                                     

}  
//---------------------------------------  
void i2c_stop()  
{  
    SCL=0;                             //a upper edge of sda when scl is high  
    delay_100us();  
    SDA=0;  
    delay_100us();  
    SCL=1;  
    delay_100us();  
    SDA=1;   
    delay_100us();  
    SDA=0;  
    delay_100us();  
    SCL=0;                            //keep the SDA and SCL low;  

}     
//---------------------------------------  
void get_ack()  
{  
    do  
    {  
        SCL=0;  
        delay_100us();  
        SDA=1;  
        delay_100us();  
        SCL=1;  
        delay_100us();  
    }  
    while(SDA);  
}  
//----------------------------------------  
void i2c_send_byte(uchar byte)  
{  

    uchar i;  
    for(i=0;i<8;i++)  
        {  
            SCL=0;  
            delay_100us();  
            SDA=byte&0x80;  
            delay_100us();  
            SCL=1;   
            delay_100us();  
            SCL=0;  
            delay_100us();  
            byte=byte<<1;  
        }  
    get_ack();        
}  
//----------------------------------------  
void i2c_write_byte(uchar dev_addr_wr,uchar word_addr,uchar mydata)  
{  
    i2c_start();  
    i2c_send_byte(dev_addr_wr);  
    i2c_send_byte(word_addr);  
    i2c_send_byte(mydata);  
    i2c_stop();  
}  
//----------------------------------------  
uchar  i2c_read_byte(uchar dev_addr_wr,uchar dev_addr_rd,uchar word_addr)  
{  
     uchar temp,i;  
     temp=0xff;  
     //---------------  
     i2c_start();  
     i2c_send_byte(dev_addr_wr);  
     i2c_send_byte(word_addr);  
     i2c_stop();                        //inital the address of device and word  
     //-------------------------------------------------------------------------  
     i2c_start();  
     i2c_send_byte(dev_addr_rd);  
     for(i=0;i<8;i++)  
        {  
            SCL=0;  
            delay_100us();  
            SDA=1;  
            delay_100us();  
            SCL=1;  
            delay_100us();  
            if(SDA)  
                {  
                    temp|=0x01;  
                }  
            else  
                {  
                    temp&=0xfe;  
                }  
             delay_100us();  
             SCL=0;  
             delay_100us();  
             temp=temp<<1;  
        }      
    SCL=0;  
    SDA=1;  
    SCL=1;  
    SCL=0;                      //read data from device  
     //-----------------------------------------------------------------------   
    i2c_stop();                 //stop the device  
    return temp;  

}  

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

2

帖子

0

蝴蝶豆

初级会员

最后登录
2021-3-30
发表于 2018-8-13 10:01:39 | 显示全部楼层
xiajintaord 发表于 2018-8-10 17:25
http://www.sublimetext.com/

嗯谢谢你 这个配色对眼睛好
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

233

帖子

82

蝴蝶豆

金牌会员

最后登录
2019-11-12
 楼主| 发表于 2018-8-14 15:16:32 | 显示全部楼层
结贴:
00 01工作模式的模拟 SPI 已经调试完成了,都在下面的附件里面;
大家基本上用的都是硬件的 SPI,但有时候受限于成本,硬件资源不足的情况下,像 IIC 一样软件模拟的 SPI 也是一个不错的选择啊。
仅仅是修改部分代码,主要是针对 SCLK 时序,要理解 SPI 在不同的工作模式下的数据收发时序;
simulate_spi.rar (895 Bytes, 下载次数: 13)
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

233

帖子

82

蝴蝶豆

金牌会员

最后登录
2019-11-12
 楼主| 发表于 2018-8-14 15:17:59 | 显示全部楼层
结贴:
00 01工作模式的模拟 SPI 已经调试完成了,都在下面的附件里面;
大家基本上用的都是硬件的 SPI,但有时候受限于成本,硬件资源不足的情况下,像 IIC 一样软件模拟的 SPI 也是一个不错的选择啊。
仅仅是修改部分代码,主要是针对 SCLK 时序,要理解 SPI 在不同的工作模式下的数据收发时序;

simulate_spi.rar

895 Bytes, 下载次数: 92, 下载积分: ST金币 -1

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3 结帖奖励

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

233

帖子

82

蝴蝶豆

金牌会员

最后登录
2019-11-12
 楼主| 发表于 2018-8-14 15:21:15 | 显示全部楼层
网络问题,导致重复提交了。。。
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

22

帖子

0

蝴蝶豆

中级会员

最后登录
2019-9-4
发表于 2018-12-12 14:25:25 | 显示全部楼层
学习了,赞赞赞
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-20 04:02 , Processed in 0.169955 second(s), 39 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表