找回密码
 立即注册
楼主: zhange

【冲哥版】stc32学习心得

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-06-17 07:01:20

62

主题

830

回帖

1552

积分

金牌会员

积分
1552
发表于 2024-5-20 12:57:31 | 显示全部楼层
本帖最后由 zhange 于 2024-5-20 16:02 编辑

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

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

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

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

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

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

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


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-06-17 07:01:20

62

主题

830

回帖

1552

积分

金牌会员

积分
1552
发表于 2024-5-20 17:22:05 | 显示全部楼层
本帖最后由 zhange 于 2024-5-21 13:27 编辑

第三十集:软件模拟IIC上


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

2.这节还是软件模拟。

截图202405201702142407.jpg

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

4.IIC协议分析
截图202405201715174173.jpg


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

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

7.启动信号

截图202405201722408482.jpg

函数编写 开始

  1. void iicStart(void)        //开始
  2. {
  3.         SCL = 1;
  4.         SDA        = 1;
  5.         Delay2us();
  6.         SDA        = 0;
  7.         Delay2us();
  8.         SCL = 0;
  9.         Delay2us();
  10. }
复制代码



停止

截图202405211207124758.jpg

  1. void iicStop(void)                //结束
  2. {
  3.         SCL = 0;
  4.         SDA        = 0;
  5.         Delay2us();
  6.         SCL = 1;
  7.         Delay2us();
  8.         SDA        = 1;
  9.         Delay2us();
  10. }
复制代码




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



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:398
  • 最近打卡:2025-06-19 00:05:30
已绑定手机

143

主题

1690

回帖

2578

积分

金牌会员

积分
2578
发表于 2024-5-21 09:08:52 来自手机 | 显示全部楼层
向你学习,我学了好几天都没什么头绪
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2024-09-12 20:44:49

2

主题

64

回帖

358

积分

中级会员

积分
358
发表于 2024-5-21 10:07:41 | 显示全部楼层
vb2*** 发表于 2024-5-21 09:08
向你学习,我学了好几天都没什么头绪

俺也一样。。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-06-17 07:01:20

62

主题

830

回帖

1552

积分

金牌会员

积分
1552
发表于 2024-5-21 13:29:29 | 显示全部楼层
本帖最后由 zhange 于 2024-5-21 16:24 编辑

第三十集:软件模拟IIC下


1.发送ack 函数


截图202405211337016281.jpg


  1. void iicSendAck(void)        //ack
  2. {
  3.         SDA        = 0;
  4.         Delay2us();
  5.         SCL = 1;
  6.         Delay2us();
  7.         SCL = 0;
  8.         Delay2us();
  9. }
  10. void iicSendNoAck(void)        //noack
  11. {
  12.         SDA        = 1;
  13.         Delay2us();
  14.         SCL = 1;
  15.         Delay2us();
  16.         SCL = 0;
  17.         Delay2us();
  18. }
复制代码


2.接收ack指令

截图202405211328413908.jpg

  1. void iicDengAck(void)        //等到从机ACK  1是不应答  0是应答
  2. {
  3.         SDA        = 1;
  4.         Delay2us();
  5.         SCL = 1;
  6.         Delay2us();
  7.         ack = SDA;
  8.         Delay2us();
  9.         SCL = 0;
  10.         Delay2us();
  11.         
  12. }
复制代码

3.发送一个字节
截图202405211619285996.jpg

  1. void iicSendOne(u8 dat)        //发送一个字节
  2. {
  3.         u8 i=8;
  4.         SCL = 0;
  5.         do
  6.         {
  7.                 if( dat& 0x80 )
  8.                         SDA        = 1;
  9.                 else
  10.                         SDA        = 0;
  11.                 Delay2us();
  12.                 dat<<=1;
  13.                 SCL = 1;
  14.                 Delay2us();
  15.                 SCL = 0;
  16.                 Delay2us();       
  17.         }
  18.         while(--i);
  19. }
复制代码

。。。。换楼  太长了  不好编辑
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-06-17 07:01:20

62

主题

830

回帖

1552

积分

金牌会员

积分
1552
发表于 2024-5-21 16:27:45 | 显示全部楼层
本帖最后由 zhange 于 2024-5-21 16:33 编辑

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

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

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

  1. u8 iicDuOne(void)        //读取一个字节
  2. {
  3.         u8 i=8,dat=0;
  4.         SCL = 0;
  5.         SDA        = 1;
  6.         do
  7.         {
  8.                 SCL = 1;
  9.                 Delay2us();
  10.                 dat<<=1;
  11.                 if( SDA )
  12.                         dat |= 1;
  13.                 SCL = 0;
  14.                 Delay2us();
  15.         }
  16.         while(--i);
  17.         
  18.         return dat;
  19. }
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-06-17 07:01:20

62

主题

830

回帖

1552

积分

金牌会员

积分
1552
发表于 2024-5-22 06:54:20 | 显示全部楼层
本帖最后由 zhange 于 2024-5-22 16:23 编辑

第三十一集:硬件IIC

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

截图202405220655595421.jpg

默认的为00  1.5和1.4

截图202405220659022787.jpg

2.添加模式选择代码


#if mode == 0


#elif mode == 1


#elif mode == 2


#endif


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


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


5.初始化函数

  1. void iicInit(void)
  2. {
  3.         P_SW2 = P_SW2 | 0x10;  //选择功能脚 2.5 2.4
  4.         I2CCFG = 0xe0; //使能主机模式
  5.         I2CMSST = 0x00; //设置主机空闲状态
  6. }
复制代码



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

  1. void Delay2us(void)        //@22.1184MHz
  2. {
  3.         while( !(I2CMSST & 0X40) );
  4.         I2CMSST &= (~0X40);
  5. }
复制代码


7.开始结束应答函数

  1. void iicStart(void)        //开始
  2. {
  3.         I2CMSCR = 0X01;                        //开始命令
  4.         Delay2us();
  5. }
  6. void iicStop(void)                //结束
  7. {
  8.         I2CMSCR = 0X06;                        //结束命令
  9.         Delay2us();
  10. }
  11. void iicSendAck(void)        //ack
  12. {
  13.         I2CMSST = 0X00;                        //发送aCK
  14.         I2CMSCR = 0X05;                        //aCK命令
  15.         Delay2us();
  16. }
  17. void iicSendNoAck(void)        //noack
  18. {
  19.                 I2CMSST = 0X01;                        //发送naCK
  20.                 I2CMSCR = 0X05;                        //aCK命令
  21.         Delay2us();
  22. }
  23. void iicDengAck(void)        //等到从机ACK  1是不应答  0是应答
  24. {
  25.         I2CMSCR = 0X03;                        //接收aCK
  26.         Delay2us();
  27.        
  28. }
  29. void iicSendOne(u8 dat)        //发送一个字节
  30. {
  31.                 I2CTXD = dat;                        //发送的数据写入寄存器
  32.                 I2CMSCR = 0X02;                        //发送
  33.                 Delay2us();       
  34. }
  35. u8 iicDuOne(void)        //读取一个字节
  36. {
  37.   I2CMSCR = 0X04;                        //发送
  38.         Delay2us();               
  39.         return I2CRXD;
  40. }
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-06-17 07:01:20

62

主题

830

回帖

1552

积分

金牌会员

积分
1552
发表于 2024-5-22 16:25:17 | 显示全部楼层
本帖最后由 zhange 于 2024-5-22 16:26 编辑

第三十一集:硬件IIC 2


我这里写的是开机次数的存储和读取,直接读写的地址0  
  1. // 发送开始命令 发送器件地址(写) 发送数据地址 发送开始命令 发送器件地址(读)读数据
  2. void IIC_Read_NByte(unsigned char *p,unsigned char number)        //iic读取连续的几个字节
  3. {
  4.         iicStart();
  5.         iicSendOne(0xa0);
  6.         iicDengAck();
  7.         
  8.         iicSendOne(0);
  9.         iicDengAck();
  10.         
  11.         iicStart();
  12.         iicSendOne(0xa1);        
  13.         iicDengAck();        
  14.         
  15.         do
  16.         {
  17.                 *p = iicDuOne();        //P[0] => P[1]
  18.                 p++;
  19.                 if( number!=1 )
  20.                         iicSendAck();
  21.         }
  22.         while(--number);
  23.         iicSendNoAck();
  24.         iicStop();        
  25. }
  26. void IIC_Write_NByte(unsigned char *p,unsigned char number )        //iic写入连续的几个字节
  27. {
  28.         iicStart();
  29.         iicSendOne(0xa0);
  30.         iicDengAck();
  31.         
  32.         iicSendOne(0);
  33.         iicDengAck();
  34.         
  35.         do
  36.         {
  37.                 iicSendOne(*p);
  38.                 p++;
  39.                 iicDengAck();
  40.         }
  41.         while(--number);
  42.         
  43.         iicStop();        
  44. }
复制代码
截图202405221626222533.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-06-17 07:01:20

62

主题

830

回帖

1552

积分

金牌会员

积分
1552
发表于 2024-5-22 16:27:42 | 显示全部楼层
手里现在有2个屏幕看一个是iic协议   玩玩 再看教程。。。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:548
  • 最近打卡:2025-06-18 08:33:08
已绑定手机

1

主题

838

回帖

1695

积分

金牌会员

积分
1695
发表于 2024-5-24 08:26:59 | 显示全部楼层
看看硬件IIC与软件模拟IIC的区别
靡不有初,鲜克有终
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-19 05:59 , Processed in 0.189728 second(s), 102 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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