你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

(源码)STM32模拟SPI实现不同工作模式的问题

[复制链接]
xiajintaord 提问时间:2018-8-10 11:58 /
阅读主题, 点击返回1楼
收藏 2 评论15 发布时间:2018-8-10 11:58
15个回答
feixiang20 回答时间: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

查看全部评分

dengdenghui 回答时间:2018-8-13 10:01:39
xiajintaord 发表于 2018-8-10 17:25
http://www.sublimetext.com/

嗯谢谢你 这个配色对眼睛好
xiajintaord 回答时间:2018-8-14 15:16:32
结贴:
00 01工作模式的模拟 SPI 已经调试完成了,都在下面的附件里面;
大家基本上用的都是硬件的 SPI,但有时候受限于成本,硬件资源不足的情况下,像 IIC 一样软件模拟的 SPI 也是一个不错的选择啊。
仅仅是修改部分代码,主要是针对 SCLK 时序,要理解 SPI 在不同的工作模式下的数据收发时序;
simulate_spi.rar (895 Bytes, 下载次数: 13)
xiajintaord 回答时间:2018-8-14 15:17:59
结贴:
00 01工作模式的模拟 SPI 已经调试完成了,都在下面的附件里面;
大家基本上用的都是硬件的 SPI,但有时候受限于成本,硬件资源不足的情况下,像 IIC 一样软件模拟的 SPI 也是一个不错的选择啊。
仅仅是修改部分代码,主要是针对 SCLK 时序,要理解 SPI 在不同的工作模式下的数据收发时序;

simulate_spi.rar

下载

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

评分

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

查看全部评分

xiajintaord 回答时间:2018-8-14 15:21:15
网络问题,导致重复提交了。。。
zhouxb 回答时间:2018-12-12 14:25:25
学习了,赞赞赞
12
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版