zhange 发表于 2024-5-20 12:57:31

本帖最后由 zhange 于 2024-5-20 16:02 编辑

第二十九集:SPI读写FLASH芯片

1.1维数组名就是这个数组的首地址,也是一个指针。

2.和一个器件spi协议链接,首先要读器件的手册,切记

3.啥叫在同一个页里面写???

4.读地址读两次,芯片可能休眠,第一次读出来可能不正确。

5.看一遍看的迷迷糊糊,好像看懂了,又好像??

====等我看完全集二刷====


zhange 发表于 2024-5-20 17:22:05

本帖最后由 zhange 于 2024-5-21 13:27 编辑

第三十集:软件模拟IIC上


1. 另一个总线,同步串行总线。

2.这节还是软件模拟。



3.空闲状态:scl sda都是高电平。

4.IIC协议分析



5.这里是软件模拟,应答信号也可以模拟吧????

6.发送数据时,scl为1时sda电平不能改变。

7.启动信号



函数编写 开始

void iicStart(void)        //开始
{
        SCL = 1;
        SDA        = 1;
        Delay2us();
        SDA        = 0;
        Delay2us();
        SCL = 0;
        Delay2us();
}


停止



void iicStop(void)                //结束
{
      SCL = 0;
      SDA      = 0;
      Delay2us();
      SCL = 1;
      Delay2us();
      SDA      = 1;
      Delay2us();
}




8.教程里iic是连接的外设msb数据传输方式,高位在前,低位在后。



vb2002 发表于 2024-5-21 09:08:52

向你学习,我学了好几天都没什么头绪

qike009 发表于 2024-5-21 10:07:41

vb2002 发表于 2024-5-21 09:08
向你学习,我学了好几天都没什么头绪
俺也一样。。

zhange 发表于 2024-5-21 13:29:29

本帖最后由 zhange 于 2024-5-21 16:24 编辑

第三十集:软件模拟IIC下


1.发送ack 函数






void iicSendAck(void)      //ack
{
      SDA      = 0;
      Delay2us();
      SCL = 1;
      Delay2us();
      SCL = 0;
      Delay2us();
}

void iicSendNoAck(void)      //noack
{
      SDA      = 1;
      Delay2us();
      SCL = 1;
      Delay2us();
      SCL = 0;
      Delay2us();
}

2.接收ack指令



void iicDengAck(void)      //等到从机ACK1是不应答0是应答
{
      SDA      = 1;
      Delay2us();
      SCL = 1;
      Delay2us();
      ack = SDA;
      Delay2us();
      SCL = 0;
      Delay2us();
      
}
3.发送一个字节


void iicSendOne(u8 dat)        //发送一个字节
{
        u8 i=8;
        SCL = 0;
        do
        {
                if( dat& 0x80 )
                        SDA        = 1;
                else
                        SDA        = 0;
                Delay2us();
                dat<<=1;
                SCL = 1;
                Delay2us();
                SCL = 0;
                Delay2us();       
        }
        while(--i);
}
。。。。换楼太长了不好编辑

zhange 发表于 2024-5-21 16:27:45

本帖最后由 zhange 于 2024-5-21 16:33 编辑

第三十集:软件模拟IIC下 二接上

看老师视频和代码开始的SCL = 0;都没写也可以用不知道咋回事? 我研究下

看了下代码应答的时候已经把SCL拉低了
1.接受一个字节


u8 iicDuOne(void)      //读取一个字节
{
      u8 i=8,dat=0;
      SCL = 0;
      SDA      = 1;
      do
      {
                SCL = 1;
                Delay2us();
                dat<<=1;
                if( SDA )
                        dat |= 1;
                SCL = 0;
                Delay2us();
      }
      while(--i);
      
      return dat;
}


zhange 发表于 2024-5-22 06:54:20

本帖最后由 zhange 于 2024-5-22 16:23 编辑

第三十一集:硬件IIC

1.硬件iic功能脚不能随便选择,有四组可以选择。



默认的为001.5和1.4



2.添加模式选择代码


#if mode == 0


#elif mode == 1


#elif mode == 2


#endif


3.不确定优先级就加上()。


4.硬件的通信协议一般需要初始化,不要忘了调用初始化函数。


5.初始化函数

void iicInit(void)
{
        P_SW2 = P_SW2 | 0x10;//选择功能脚 2.5 2.4
        I2CCFG = 0xe0; //使能主机模式
        I2CMSST = 0x00; //设置主机空闲状态
}


6.等待系统执行完命令 为了兼容 模拟的iic 用的延时函数

void Delay2us(void)        //@22.1184MHz
{
        while( !(I2CMSST & 0X40) );
        I2CMSST &= (~0X40);
}

7.开始结束应答函数

void iicStart(void)        //开始
{
        I2CMSCR = 0X01;                        //开始命令
        Delay2us();
}


void iicStop(void)                //结束
{
        I2CMSCR = 0X06;                        //结束命令
        Delay2us();
}


void iicSendAck(void)        //ack
{
        I2CMSST = 0X00;                        //发送aCK
        I2CMSCR = 0X05;                        //aCK命令
        Delay2us();
}

void iicSendNoAck(void)        //noack
{
                I2CMSST = 0X01;                        //发送naCK
                I2CMSCR = 0X05;                        //aCK命令
        Delay2us();
}


void iicDengAck(void)        //等到从机ACK1是不应答0是应答
{
        I2CMSCR = 0X03;                        //接收aCK
        Delay2us();
       
}


void iicSendOne(u8 dat)        //发送一个字节
{
                I2CTXD = dat;                        //发送的数据写入寄存器
                I2CMSCR = 0X02;                        //发送
                Delay2us();       

}

u8 iicDuOne(void)        //读取一个字节
{
I2CMSCR = 0X04;                        //发送
        Delay2us();               
        return I2CRXD;
}


zhange 发表于 2024-5-22 16:25:17

本帖最后由 zhange 于 2024-5-22 16:26 编辑

第三十一集:硬件IIC 2


我这里写的是开机次数的存储和读取,直接读写的地址0
// 发送开始命令 发送器件地址(写) 发送数据地址 发送开始命令 发送器件地址(读)读数据
void IIC_Read_NByte(unsigned char *p,unsigned char number)      //iic读取连续的几个字节
{
      iicStart();
      iicSendOne(0xa0);
      iicDengAck();
      
      iicSendOne(0);
      iicDengAck();
      
      iicStart();
      iicSendOne(0xa1);      
      iicDengAck();      
      
      do
      {
                *p = iicDuOne();      //P => P
                p++;
                if( number!=1 )
                        iicSendAck();

      }
      while(--number);
      iicSendNoAck();
      iicStop();      
}


void IIC_Write_NByte(unsigned char *p,unsigned char number )      //iic写入连续的几个字节
{
      iicStart();
      iicSendOne(0xa0);
      iicDengAck();
      
      iicSendOne(0);
      iicDengAck();
      
      do
      {
                iicSendOne(*p);
                p++;
                iicDengAck();
      }
      while(--number);
      
      iicStop();      
}

zhange 发表于 2024-5-22 16:27:42

手里现在有2个屏幕看一个是iic协议   玩玩 再看教程。。。{:4_165:}{:4_165:}{:4_165:}

小涵子爸爸 发表于 2024-5-24 08:26:59

看看硬件IIC与软件模拟IIC的区别
页: 1 2 3 4 5 [6] 7
查看完整版本: 【冲哥版】stc32学习心得