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();
}
//----------------------------------------
uchari2c_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;

}

dengdenghui 发表于 2018-8-13 10:01:39

xiajintaord 发表于 2018-8-10 17:25
http://www.sublimetext.com/

嗯谢谢你 这个配色对眼睛好:lol

xiajintaord 发表于 2018-8-14 15:16:32

结贴:
00 01工作模式的模拟 SPI 已经调试完成了,都在下面的附件里面;
大家基本上用的都是硬件的 SPI,但有时候受限于成本,硬件资源不足的情况下,像 IIC 一样软件模拟的 SPI 也是一个不错的选择啊。
仅仅是修改部分代码,主要是针对 SCLK 时序,要理解 SPI 在不同的工作模式下的数据收发时序;

xiajintaord 发表于 2018-8-14 15:17:59

结贴:
00 01工作模式的模拟 SPI 已经调试完成了,都在下面的附件里面;
大家基本上用的都是硬件的 SPI,但有时候受限于成本,硬件资源不足的情况下,像 IIC 一样软件模拟的 SPI 也是一个不错的选择啊。
仅仅是修改部分代码,主要是针对 SCLK 时序,要理解 SPI 在不同的工作模式下的数据收发时序;

xiajintaord 发表于 2018-8-14 15:21:15

网络问题,导致重复提交了。。。

zhouxb 发表于 2018-12-12 14:25:25

学习了,赞赞赞
页: 1 [2]
查看完整版本: (源码)STM32模拟SPI实现不同工作模式的问题