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

冲哥STC32G单片机学习笔记

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2025-05-04 11:02:22

2

主题

87

回帖

898

积分

高级会员

积分
898
发表于 2023-10-5 15:25:59 | 显示全部楼层
本帖最后由 noonezero 于 2023-10-5 18:17 编辑

第十九课:NTC温度采集


1.NTC原理

NTC是指随温度上升电阻呈指数关系减小,具有负温度系数的热敏电阻现象和材料


公式
截图202310051814234407.jpg


代码:记得端口配置高阻输入
我按课件送的表做的,常温显示41度多,估计是表的问题
  1. #include "config.h"
  2. #include <STC32G.H>
  3. #include "../COMM/stc32_stc8_usb.h"
  4. #include "stdio.h"
  5. #include "ntc.h"
  6. void sys_init();
  7. //USB调试及复位所需定义
  8. char *USER_DEVICEDESC = NULL;
  9. char *USER_PRODUCTDESC = NULL;
  10. char *USER_STCISPCMD = "@STCISP#";
  11. // ADC初始化
  12. void ADC_init()
  13. {
  14.         ADCTIM = 0x3F;        // 设置ADC内部时序
  15.         ADCCFG = 0x2F;        // 数据右对齐,方便合二为一。时钟选择为最慢
  16.         ADC_CONTR = 0x83;                // 1000 0011 选择通道0011 P1.3
  17. }
  18. // ADC读取
  19. int ADC_Read()
  20. {
  21.         int res;                                // ADC数值保存变量
  22.         ADC_START = 1;                        // 开启ADC转化
  23.         _nop_();                                // 空操作指令
  24.         _nop_();
  25.         while(!ADC_FLAG);                // 等待ADC转换结束
  26.         ADC_FLAG = 0;                        // 手动清零
  27.         res = (ADC_RES << 8) | ADC_RESL;        // 计算ADC数值
  28.         
  29.         return res;
  30. }
  31. void main()
  32. {
  33.         int adcval;
  34.         int res;
  35.         
  36.         P0M1 |= 0x08;
  37.         sys_init();
  38.         usb_init();  //USB初始化
  39.         EA = 1;
  40.         
  41.         ADC_init();
  42.         adcval = ADC_Read();
  43.         res = Temp_Cal(adcval);
  44.         
  45.         while(1)
  46.         {
  47.                 if (bUsbOutReady)
  48.         {
  49.             //USB_SendData(UsbOutBuffer, 64);
  50.             usb_OUT_done();
  51.                         printf("temp \t%d\tadc \t%d\r\n", res, adcval);
  52.                 }
  53.         }
  54. }
  55. void sys_init()
  56. {
  57.     WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  58.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  59.     CKCON = 0; //提高访问XRAM速度
  60.     P0M1 = 0x30;   P0M0 = 0x30;   //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
  61.     P1M1 = 0x32;   P1M0 = 0x32;   //设置P1.1、P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V), P1.1在PWM当DAC电路通过电阻串联到P2.3
  62.     P2M1 = 0x3c;   P2M0 = 0x3c;   //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V),设置开漏模式需要断开PWM当DAC电路中的R2电阻
  63.     P3M1 = 0x50;   P3M0 = 0x50;   //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
  64.     P4M1 = 0x3c;   P4M0 = 0x3c;   //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
  65.     P5M1 = 0x0c;   P5M0 = 0x0c;   //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
  66.     P6M1 = 0xff;   P6M0 = 0xff;   //设置为漏极开路(实验箱加了上拉电阻到3.3V)
  67.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  68. }
复制代码



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2025-05-04 11:02:22

2

主题

87

回帖

898

积分

高级会员

积分
898
发表于 2023-10-6 15:05:25 | 显示全部楼层
本帖最后由 noonezero 于 2023-10-6 16:54 编辑

第二十课:串口通信


1.什么是通信

通信是指设备之间通过一定协议进行的信息交换。


2.什么是串口通信
串口通信是指外设和计算机之间,通过数据信号线,地线,控制线等,按位进行传输数据的一种通讯方式。
优点是,使用的数据线少,节约通信成本。
缺点是,传输速度比并行低


3,全双工和半双工的区别
截图202310061426126316.jpg


4.串口通信基础知识
截图202310061504484616.jpg


5.解决传输距离问题
截图202310061506274357.jpg



代码:
我尝试加入自动下载没成功,暂时先不用自动下载
我没冲哥232转USB线,直接用的串口工具,串口排针引脚如下,我用的P46 P47
截图202310061653596072.jpg

  1. #include <STC32G.H>
  2. void sys_init();
  3. #define                FOSC        11059200UL                // 定义无符号长整数型 避免计算溢出
  4. #define                BRT                (65536 - (FOSC/115200+2)/4)                // 加2操作是为了让keil编译器自动实现四舍五入运算
  5. bit busy;                        // 忙碌标志位 1,忙碌  0,空闲
  6. char wptr;                        // 接收到的数据个数
  7. char rptr;
  8. char buffer[16];
  9. void Usaart2_Init(void)
  10. {
  11.         P_SW2 = 0x80;
  12.         P_SW2 |= 0x01;                // 将串口2的引脚切换到P46 P47
  13.         S2CFG = 0x01;                // 用串口2此位必须置1,否则有不可预测错误
  14.         
  15.         S2CON = 0x50;                // 0101  串口控制寄存器 配置模式 允许串口接收数据
  16.         T2L = BRT;
  17.         T2H = BRT >> 8;
  18.         T2x12 = 1;
  19.         T2R = 1;
  20.         
  21.         wptr = 0x00;
  22.         rptr = 0x00;
  23.         busy = 0;
  24. }
  25. void Uart2Isr() interrupt 8
  26. {
  27.         if(S2TI)
  28.         {
  29.                 S2TI = 0;
  30.                 busy = 0;
  31.         }
  32.         if(S2RI)
  33.         {
  34.                 S2RI = 0;
  35.                 buffer[wptr++] = S2BUF;
  36.                 wptr &= 0x0F;
  37.         }
  38. }
  39. void Uart2Send(char dat)
  40. {
  41.         while(busy);
  42.         busy = 1;
  43.         S2BUF = dat;
  44. }
  45. void Uart2SendStr(char *p)
  46. {
  47.         while(*p)
  48.         {
  49.                 Uart2Send(*p++);
  50.         }
  51. }
  52. void main()
  53. {
  54.         sys_init();
  55.         EA = 1;
  56.         
  57.         Usaart2_Init();
  58.         IE2 = 0x01;
  59.         
  60.         Uart2SendStr("noonezero\r\n");
  61.         
  62.         while(1)
  63.         {
  64.                 if(rptr != wptr)
  65.                 {
  66.                         Uart2Send(buffer[rptr++]);
  67.                         rptr &= 0x0F;
  68.                 }
  69.         }
  70. }
  71. void sys_init()
  72. {
  73.     WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  74.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  75.     CKCON = 0; //提高访问XRAM速度
  76.     P0M1 = 0x30;   P0M0 = 0x30;   //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
  77.     P1M1 = 0x32;   P1M0 = 0x32;   //设置P1.1、P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V), P1.1在PWM当DAC电路通过电阻串联到P2.3
  78.     P2M1 = 0x3c;   P2M0 = 0x3c;   //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V),设置开漏模式需要断开PWM当DAC电路中的R2电阻
  79.     P3M1 = 0x50;   P3M0 = 0x50;   //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
  80.     P4M1 = 0x3c;   P4M0 = 0x3c;   //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
  81.     P5M1 = 0x0c;   P5M0 = 0x0c;   //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
  82.     P6M1 = 0xff;   P6M0 = 0xff;   //设置为漏极开路(实验箱加了上拉电阻到3.3V)
  83.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  84. }
复制代码





回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2025-05-04 11:02:22

2

主题

87

回帖

898

积分

高级会员

积分
898
发表于 2023-10-12 11:48:15 | 显示全部楼层
第二十一课:串口应用


这节课主要讲了如何运用串口实现控制点灯,显示数码管等操作,主要是判断是否有结束符\r\n来进行操作




这节课感觉还是没有如何应用好,代码以后再补
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2025-05-04 11:02:22

2

主题

87

回帖

898

积分

高级会员

积分
898
发表于 2023-10-12 16:35:26 | 显示全部楼层
第二十二课:CDC串口通信


1.CDC串口通信的好处

  1.数据传输更快:USB-CDC虚拟串口忽略传统串口的波特率,传输速度的比特率为全速USB通信速度12MBPS(每秒12M位)
  2.使用更简单便携:USB-CDC虚拟串口忽略传统串口的起始位、停止位等冗余信息
  3.数据传输更可靠:USB-CDC虚拟串口丢弃传统串口简单的软件奇偶校验机制,USB-CDC虚拟串口数据传输时有USB硬件CRC校验,以及校验出错重传机制,保证数据100%正确
  4.自动缓存数据:USB-CDC虚拟串口会自动缓存数据。单片机在没有处理完成上位机下传上一笔数据时,如果此时上位机又有新的数据下传,虚拟串口会自动将新的数据缓存数据。从而保证数据100%不会丢失或覆盖。


2.CDC自动下载
CDC串口通信.zip (86.01 KB, 下载次数: 180)





回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2025-05-04 11:02:22

2

主题

87

回帖

898

积分

高级会员

积分
898
发表于 2023-10-12 19:13:31 | 显示全部楼层
本帖最后由 noonezero 于 2023-10-12 19:49 编辑

第二十三课:看门狗

1.看门狗时什么

看门狗时一个计数器,它的基本功能时在软件问题和程序跑偏后重启系统。看门狗正常工作时会自动计数,程序进程会定时将其归零。如果系统在某些地方卡住或者跑了,定时器就会溢出,使系统强制复位


2.看门狗的意义
软件的可靠性一直是一个关键问题。任何使用软件的人都可能遇到电脑死机或者程序失控的问题,这种问题在嵌入式系统中也存在
由于单片机抗干扰能力有限,在工业现场仪器仪表中,经常因电压不稳和电弧干扰而死机。
在无人值守的情况下,系统因干扰无法重启。为了保证系统受到干扰后能自动恢复正常,就需要看门狗


3.实现原理
系统运行以后也就启动了看门狗计数器,看门狗就开始自动计数。如果到了一定的时间还不去清理看门狗(喂狗),那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。


4.代码
看门狗.zip (102.62 KB, 下载次数: 172)





回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2025-05-04 11:02:22

2

主题

87

回帖

898

积分

高级会员

积分
898
发表于 2023-10-13 10:53:41 | 显示全部楼层
本帖最后由 noonezero 于 2023-10-14 08:12 编辑

第二十四课:比较器


1.内部结构图

截图202310130738121757.jpg

CMPPS[I:O]:比较器正端输入选择

CMPNS:比较器负端输入选择

DISFLT:模拟滤波功能控制

LCDTY[5:0]:数字滤波功能控制



CMPRES:比较器的比较结果。只读


CMPOE:比较器结果输出控制位



CMPO_S:比较器输出脚选择位



CMPIF:比较器中断标志位。当 PIE 或 NIE 被使能后,产生中断信号,硬件自动将 CMPIF 置 1,并向 CPU 提出中断请求。需要软件清零。


代码:
  1. #include <STC32G.H>
  2. #include "../COMM/stc32_stc8_usb.h"
  3. void sys_init();
  4. //USB调试及复位所需定义
  5. char *USER_DEVICEDESC = NULL;
  6. char *USER_PRODUCTDESC = NULL;
  7. char *USER_STCISPCMD = "@STCISP#";
  8. void CMP_Init()
  9. {
  10. //  CMPEXCFG |= 0x40;                           //比较器DC迟滞输入选择,0:0mV; 0x40:10mV; 0x80:20mV; 0xc0:30mV
  11. //  CMPEXCFG &= ~0x04;                          //P3.6为CMP-输入脚
  12.     CMPEXCFG |= 0x04;                           //内部1.19V参考电压为CMP-输入脚
  13.     CMPEXCFG &= ~0x03;                          //P3.7为CMP+输入脚
  14. //  CMPEXCFG |= 0x01;                           //P5.0为CMP+输入脚
  15. //  CMPEXCFG |= 0x02;                           //P5.1为CMP+输入脚
  16. //  CMPEXCFG |= 0x03;                           //ADC输入脚为CMP+输入脚
  17.     CMPCR2 = 0x00;
  18.     INVCMPO = 0;                                //比较器正向输出
  19. //  INVCMPO = 1;                                //比较器反向输出
  20.     DISFLT = 0;                                 //使能0.1us滤波
  21. //  DISFLT = 1;                                 //禁止0.1us滤波
  22. //  CMPCR2 &= ~0x3f;                            //比较器结果直接输出
  23.     CMPCR2 |= 0x10;                             //比较器结果经过16个去抖时钟后输出
  24.     CMPCR1 = 0x00;
  25. //  PIE = 0;                                    //禁止比较器上升沿中断
  26.     PIE = 1;                                    //使能比较器上升沿中断
  27. //  NIE = 0;                                    //禁止比较器下降沿中断
  28.     NIE = 1;                                    //使能比较器下降沿中断
  29. //  CMPOE = 0;                                  //禁止比较器输出
  30.     CMPOE = 1;                                  //使能比较器输出
  31.     CMPO_S = 0;                                 //选择P3.4作为比较器输出脚
  32. //  CMPO_S = 1;                                 //选择P4.1作为比较器输出脚
  33.     CMPEN = 1;                                  //使能比较器模块
  34. }
  35. void main()
  36. {
  37.         sys_init();
  38.        
  39.        
  40.         IRC48MCR = 0x80;                                // 使能内部48M的USB专用IRC
  41.         while(!(IRC48MCR & 0x01));
  42.         USBCLK = 0x00;                                        // 设置USB时钟源为内部48M的USB专用IRC
  43.         USBCON = 0x90;                                        // 使能USB功能
  44.        
  45.         usb_init();                                                // 调用USB CDC初始化库函数
  46.         EA = 1;
  47.         EUSB = 1;                                                // 使能USB中断
  48.        
  49.         while(DeviceState != DEVSTATE_CONFIGURED);        // 等待USB配置完成
  50.         CMP_Init();
  51.         P6 = 0x00;
  52.        
  53.         while(1)
  54.         {
  55.                 if (bUsbOutReady)                                                        // 当硬件接收完成上位机通过串口助手发送数据后会自动将
  56.         {                                                                                        // bUsbOutReady 置1
  57.             USB_SendData(UsbOutBuffer, OutNumber);        // 接收的数据字节数保存在OutNumber变量中
  58.             usb_OUT_done();                                                        // 接收的数据保存在UsbOutBuffer缓存区
  59.                         printf("lailelaodi");
  60.                 }                                                                                        // 使用USB_SendData库函数可向上位机发送数据
  61.                                                                                                         // 调用usb_OUT_done 准备接收下一笔数据
  62.                
  63.         }
  64. }
  65. void sys_init()
  66. {
  67.     WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  68.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  69.     CKCON = 0; //提高访问XRAM速度
  70.     P0M1 = 0x30;   P0M0 = 0x30;   //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
  71.     P1M1 = 0x32;   P1M0 = 0x32;   //设置P1.1、P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V), P1.1在PWM当DAC电路通过电阻串联到P2.3
  72.     P2M1 = 0x3c;   P2M0 = 0x3c;   //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V),设置开漏模式需要断开PWM当DAC电路中的R2电阻
  73.     P3M1 = 0x53;   P3M0 = 0x50;   //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
  74.         // P30/P31和USB的D-/D+共用PIN脚 需要将P30 P31设置为高阻输入模式
  75.     P4M1 = 0x3c;   P4M0 = 0x3c;   //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
  76.     P5M1 = 0x0c;   P5M0 = 0x0c;   //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
  77.     P6M1 = 0xff;   P6M0 = 0xff;   //设置为漏极开路(实验箱加了上拉电阻到3.3V)
  78.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  79. }
  80. void CMP_Isr() interrupt 21
  81. {
  82.     CMPIF = 0;                        //清中断标志
  83.     P40 = !CMPRES;                     //中断方式读取比较器比较结果
  84. }
复制代码



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2025-05-04 11:02:22

2

主题

87

回帖

898

积分

高级会员

积分
898
发表于 2023-10-14 15:15:24 | 显示全部楼层
第二十五课:FLASH模拟EEPROM


1.Flash和EEPROM是什么
EEPROM全称“电可擦除可编程只读存储器”。是相对于紫外线擦除的ROM来讲
狭义的EEPROM:特点是可以随机访问和修改任何一个字节。掉电数据不丢失,保存时间长(100年),擦写次数多(100W次)
         具有较高的可靠性。电路复杂且成本高。很少有超过512K的


Flash:属于广义的EEPROM,因为它也是电擦除的ROM,为了区别于一般按字节为单位的擦写的EEPROM,就叫它Flash。Flash如果数据不为0xFF,需要擦除之后才能写入


通常单片机里的Flash都用于存放运行代码,在运行过程中不能改变
EEPROM是用来保存用户数据,运行过程中可以改变,比如运行过程中的密码等参数,就需要保存在EEPROM里。




2.内部EEPROM介绍
EEPROM 的写操作只能将字节中的 1 写为 0,当需要将字节中的 0 写为 1,就必须执行扇区擦除操作。
EEPROM 的读/写操作是以 1 字节为单位进行的,而 EEPROM 擦除操作是以 1 扇区( 512 字节)为单位进行
在执行擦除操作时,如果目标扇区中有需要保留的数据,则必须预先将这些数据读取到 RAM中暂存,
待擦除完成后再将保存的数据和需要更新的数据一起再写回



当使用 IAP 寄存器操作 EEPROM 时,不能打开 CACHE功能,否则可能无法访问正确 EEPROM

3.内部EEPROM的简单使用

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2025-05-04 11:02:22

2

主题

87

回帖

898

积分

高级会员

积分
898
发表于 2023-10-17 06:20:03 | 显示全部楼层
第二十五课:FLASH模拟EEPROM


1.Flash和EEPROM是什么
EEPROM全称“电可擦除可编程只读存储器”。是相对于紫外线擦除的ROM来讲
狭义的EEPROM:特点是可以随机访问和修改任何一个字节。掉电数据不丢失,保存时间长(100年),擦写次数多(100W次)
         具有较高的可靠性。电路复杂且成本高。很少有超过512K的


Flash:属于广义的EEPROM,因为它也是电擦除的ROM,为了区别于一般按字节为单位的擦写的EEPROM,就叫它Flash。Flash如果数据不为0xFF,需要擦除之后才能写入


通常单片机里的Flash都用于存放运行代码,在运行过程中不能改变
EEPROM是用来保存用户数据,运行过程中可以改变,比如运行过程中的密码等参数,就需要保存在EEPROM里。




2.内部EEPROM介绍
EEPROM 的写操作只能将字节中的 1 写为 0,当需要将字节中的 0 写为 1,就必须执行扇区擦除操作。
EEPROM 的读/写操作是以 1 字节为单位进行的,而 EEPROM 擦除操作是以 1 扇区( 512 字节)为单位进行
在执行擦除操作时,如果目标扇区中有需要保留的数据,则必须预先将这些数据读取到 RAM中暂存,
待擦除完成后再将保存的数据和需要更新的数据一起再写回



当使用 IAP 寄存器操作 EEPROM 时,不能打开 CACHE功能,否则可能无法访问正确 EEPROM

3.内部EEPROM的简单使用
Flash模拟EEPROM.zip (107.87 KB, 下载次数: 208)


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2025-05-04 11:02:22

2

主题

87

回帖

898

积分

高级会员

积分
898
发表于 2023-10-17 14:12:01 | 显示全部楼层
第二十六课:DS18B20温度传感器

1.DS18B20简介

DS18B20是常用的数字温度传感器,输出数字信号
具有体积小,硬件开销低,抗干扰能力强,精度高的特点
封装多种,可用于不同非极限温度场合
耐磨碰撞,体积小,使用方便


01.单线接口方式,一根线就可以
02.测温范围-55--+125摄氏度,误差1摄氏度
03.工作电源:3.0--5.5V/DC(可以数据线寄生电源)
04.测量结果以9--12位数字量方式串行传送


2.接线方式
单独电源供电
截图202310170753281544.jpg

寄生电源供电
截图202310170754193358.jpg


3.测温度
可以自定义精度,精度分辨率对应关系
09位    0.5度
10位    0.25度
11位    0.125度

12位    0.0625度

上电默认12位转换精度

温度对应关系
截图202310170801439101.jpg


事件序列
一,初始化
二,ROM (紧跟任何数据交换请求)
三,18B20功能命令 (紧跟任何数据交换请求)
当执行完ROM命令之后,主设备必须回到上述步骤中的第一步
截图202310170808122351.jpg



代码:
DS18B20.zip (124.33 KB, 下载次数: 189)


截图202310170756378536.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2025-05-04 11:02:22

2

主题

87

回帖

898

积分

高级会员

积分
898
发表于 2023-10-18 11:15:19 | 显示全部楼层
本帖最后由 noonezero 于 2023-10-19 06:34 编辑

第二十七课:软件模拟SPI


1.SPI简介

SPI是串行外设接口的缩写,SPI是一种高速的全双工同步通信总线,在芯片的管教上只占用四根线,节约芯片管脚。
截图202310180743348603.jpg

MISO:主机输入,从机输出(数据来自从机)
MOSI:主机输出,从机输入(数据来自主机)
SCLK:串行时钟信号,由主机产生发送给从机
SS/CS:   片选信号,主机发送,以控制与哪个从机通信,通常低电平有效信号


2.数据模式
时钟极性(CKP/CPOL)
默认时钟信号是高电平还是低电平
CKP = 0,时钟空闲IDLE为低电平0;
CKP = 1,时钟空闲IDLE为高电平1;


时钟相位(CKE/CPHA)
CPHA = 0,时钟信号SCK的第一个跳变沿采样
CPHA = 1,时钟信号SCK的第二个跳变沿采样



时钟极性和相位共同决定读取数据的方式,比如信号上升沿读取数据还是信号下降沿读取数据
MSB:高位开始读写
LSB:低位开始读写


截图202310180801563799.jpg


代码
如果选择的频率低的话,可以按冲哥视频中直接使用
我选择24M,就需要加SPI_Delay函数,否则无法通信
截图202310190634304422.jpg
软件模拟SPI.zip (105.49 KB, 下载次数: 169)



回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-7 11:54 , Processed in 0.669454 second(s), 99 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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