工作内容:
通过测试EKT-YMCC8405AAAVUCL-HT16C23(I2C)、YMMO0216AAAAUGN-ST7567(ISP,8080)、YMC128128-96AAAFDGL(UART)、YMC9284-01AAANUGN(4SPI)各类产品,排查问题,深究不同传输方式EKT-YMCC8405AAAVUCL展盒制作和工艺制作流程。
本周09/18加班修改EKT-YMCC8405AAAVUCL-HT16C23(I2C)展盒文件
感悟:
一方面锻炼硬件技术:让排查硬件链接、断短、供电、电流功率和设计电路板的阻值排线引脚等。
另一方面深耕软件技术:了解探究最底层的连接方式,时序图,对于IC资料来规定初始化进行软件编排✍️,习惯性的理解不同产品的特殊性,对于IC选型的考究。
心得:在派发任务,发现问题时,先考虑是知识点还是技术性问题,还是人员安排,尽可能不影响时间调度,提前做时间规划给领导及时汇报,以免耽误进程,两头催。
每一周做一份工作汇报,为下周工作做规划,排好进度,同时,回顾这周所做,把知识点问题跟进解决现有漏洞,尽可能让技术性问题形成经验之谈。
YMC12864-447AAAFUGL 4spi
/****************************************************** write_com(uchar) write_dat(uchar) *******************************************************/ //serial 4-SPIÐ void write_com(unsigned char byte) { unsigned char i; cd=0; for(i=0;i<8;i++) { sck=0; _nop_(); _nop_(); sda=(bit)(byte&0x80); byte=byte<<1; sck=1; _nop_(); _nop_(); } } //serial 4-SPIÐ void write_dat(unsigned char byte) { unsigned char i; cd=1; for(i=0;i<8;i++) { sck=0; nop(); nop(); sda=(bit)(byte&0x80); sck=1; byte=byte<<1; nop(); nop(); } }EKT-YMCC8405AAAVUCL i2c
#include <Reg52.h> #include <intrins.h> bit ack; void Start_I2c(); void start_i2c() { sda=1; nop(); sck=1; nop(); nop(); nop(); nop(); nop(); sda=0; nop(); nop(); nop(); nop(); nop(); sck=0; nop(); nop(); } void Stop_I2c(); void stop_i2c() { sda=0; nop(); sck=1; nop(); nop(); nop(); nop(); nop(); sda=1; nop(); nop(); nop(); nop(); } void SendByte(unsigned char c); void sendbyte(unsigned char c) { unsigned char BitCnt; for(BitCnt=0;BitCnt<8;BitCnt++) { if((c<<BitCnt)&0x80)sda=1; else sda=0; nop(); sck=1; nop(); nop(); nop(); nop(); nop(); sck=0; } _nop_(); _nop_(); sda=1; _nop_(); _nop_(); sck=1; _nop_(); _nop_(); _nop_(); if(sda==1)ack=0; else ack=1; sck=0; _nop_(); _nop_(); } unsigned char RcvByte(); unsigned char RcvByte() { unsigned char retc; unsigned char BitCnt; retc=0; sda=1; for(BitCnt=0;BitCnt<8;BitCnt++) { nop(); sck=0; nop(); nop(); nop(); nop(); nop(); sck=1; nop(); nop(); retc=retc<<1; if(sda==1)retc=retc+1; nop(); nop(); } sck=0; nop(); nop(); return(retc); } void Ack_I2c(bit a); void Ack_I2c(bit a) { if(a==0)sda=0; else sda=1; nop(); nop(); nop(); sck=1; nop(); nop(); nop(); nop(); nop(); sck=0; nop(); nop(); } bit ISendByte(unsigned char sla,ucahr c); bit ISendByte(unsigned char sla,unsigned char c) { Start_I2c(); SendByte(sla); if(ack==0)return(0); SendByte(c); if(ack==0)return(0); Stop_I2c(); return(1); } bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no); bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) { unsigned char i; Start_I2c(); SendByte(sla); if(ack==0)return(0); SendByte(suba); if(ack==0)return(0); for(i=0;i<no;i++) { SendByte(*s); if(ack==0)return(0); s++; } Stop_I2c(); return(1); } bit IRcvByte(unsigned char sla,ucahr *c); bit IRcvByte(unsigned char sla,unsigned char *c) { Start_I2c(); SendByte(sla+1); if(ack==0)return(0); *c=RcvByte(); Ack_I2c(1); Stop_I2c(); return(1); } bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no); bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) { unsigned char i; Start_I2c(); SendByte(sla); if(ack==0)return(0); SendByte(suba); if(ack==0)return(0); Start_I2c(); SendByte(sla+1); if(ack==0)return(0); for(i=0;i<no-1;i++) { *s=RcvByte(); Ack_I2c(0); s++; } *s=RcvByte(); Ack_I2c(1); Stop_I2c(); return(1); }YMC128128-96AAAFDGL软件uart串口中断
void int0_int(void) interrupt 0 { if(pause_en) { pause_en=0; pause=(pause?0:1); TH2=RCAP2H; TL2=RCAP2L; timer2_int_times=0; TR2=1; } } void t0_int(void) interrupt 1 { delay=0; TR0=0; } void t2_int(void) interrupt 5 { if(EXF2)EXF2=0; if(TF2) { TF2=0; timer2_int_times++; if(timer2_int_times==6)//300ms { timer2_int_times=0; TR2=0; pause_en=1; } } } void uart_int(void) interrupt 4 { if(RI)uart_rx(); if(TI)uart_tx(); } void uart_rx(void) { RI=0; m=SBUF; rx[rx_n++]=m; if(rx_n==rx_max){rok=1;rx_n=0;} } void uart_tx(void) { TI=0; tok=1; } void mcu_initial(void) { rok=0; rx_n=0; rx_max=1; tok=1; tx_n=0; tx_max=0; P0=0xff; P1=0xff; P2=0xff; P3=0xff; //T0-timer ,T1-Baud Generator TMOD=0x21;//T1 Timer-8bit auto reload ,T0 Timer-16 bit SCON=0x70;//mode-1 [8bit ,strict stop-bit ,enable Rx-work] PCON&=0x3F;// //TH1=253;//BAUD=11.0592M/12/32/3=9600 (At 12T) TH1=243;//BAUD=12M/12/32/13=2403 (At 12T) TR1=1; T2CON=0x00; T2MOD=0x00; RCAP2L=(65536-50000)%256; RCAP2H=(65536-50000)/256; EA=1; ES=1; ET0=1; ET2=1; IT0=1; EX0=1; AUXR=0x01; }YMMO0216AAAAUGN-ST7567 8080
sfr ISP_CONTR = 0xe7; void isp_delay( unsigned int i ) using 1 { while( i-- > 0); } void isp_init(void) { delay_10us(); delay_100us(); delay_us(0); delay_ms(0); delay_ss(0); IP = 0x10; IE = 0x90; TMOD = 0x20; TL1 = 0xfd; TH1 = 0xfd; SCON = 0xd8; PCON = 0x00; TR1 = 1; EA=1; } void isp_seria() interrupt 4 using 1{ EA=0;RI=0;TR1=0; isp_delay(50000); isp_delay(50000); ISP_CONTR = 0x60; }ISP传输
/****************************************************** write_com(uchar) write_com2(uchar,uchar) write_dat(uchar) *******************************************************/ void write_com(unsigned char byte) { // unsigned char i; rs=0; wr=1; // db=0xff; // do // { // // rd=0; // i=db; // rd=1; // }while(i&0x80); db=byte; wr=0; wr=1; } //void write_com2(unsigned char byte1,unsigned char byte2) //{ //// unsigned char i; // rs=0; // wr=1; //// db=0xff; //// do //// { //// //// rd=0; //// i=db; //// rd=1; //// }while(i&0x80); // // db=byte1; // wr=0; // wr=1; // // db=byte2; // wr=0; // wr=1; //} void write_dat(unsigned char byte) { // unsigned char i; rs=0; wr=1; // db=0xff; // do // { // rd=0; // i=db; // rd=1; // }while(i&0x80); rs=1; db=byte; wr=0; wr=1; }对比表
| 名称 | 类型 | 线数 | 同步/异步 | 双工 | 拓扑 | 速度 | 典型用途 |
|---|---|---|---|---|---|---|---|
| SPI | 通信接口 | 4+ | 同步 | 全双工 | 一主多从,片选 | 高 | Flash、传感器、LCD |
| 4线SPI | SPI接线方式 | 4 | 同步 | 通常全双工,LCD单向 | 一主多从 | 高 | LCD、Flash |
| I2C | 通信接口 | 2 | 同步 | 半双工 | 多主多从,地址寻址 | 中低 | 传感器、EEPROM |
| UART | 通信接口 | 2 | 异步 | 全双工 | 点对点 | 中低 | 调试、模块通信 |
| UART串口中断 | 处理方式 | - | - | - | - | - | UART中断收发 |
| 8080 | 并行接口 | 8/16+控制 | 同步 | 通常单向写 | 点对点 | 高 | LCD并口屏 |
| ISP | 下载方式 | 2~4+ | 取决于接口 | - | - | - | 单片机烧录 |
ISP
ISP = In-System Programming,在系统编程。
意思是:不用把芯片拆下来,直接在主板上通过某些接口给单片机下载程序。
常见 ISP 接口:
SPI ISP
UART ISP
JTAG
SWD
ISP 是下载/烧录方式,不是通信协议。
8080
It usually refers to the8080 parallel interface, also known as the MCU interface, commonly used in LCD screens.
通常指8080 并口,也叫 MCU 接口,常见于 LCD 屏幕。
它模仿 Intel 8080 总线时序,线比较多:
It mimics the Intel 8080 bus timing and uses quite a few lines:
D0~D7orD0~D15:data linesD0~D7或D0~D15:数据线CS:chip selectCS:片选WR:writeWR:写RD:readRD:读DC:command/dataDC:命令/数据RST:resetRST:复位
Features:
Parallel transmission, fast speed 并行传输,速度快
Many lines, takes up a lot of I/O 线多,占 IO 多
Often used for MCU to directly drive TFT LCD 常用于单片机直接驱动 TFT LCD
Compared with SPI screens, it refreshes faster but requires more wiring 和 SPI 屏相比,刷屏更快,但接线更多
There is also the6800 parallel interface, which follows Motorola 6800 timing and is similar to 8080 but with different control lines.
另外还有6800 并口,是 Motorola 6800 时序,和 8080 类似但控制线不同。
UART
异步串行、全双工、点对点通信。
两根线:
TX:发送RX:接收
注意:两个设备要交叉连接:
text
A.TX -> B.RX A.RX -> B.TX特点:
没有时钟线,靠双方约定波特率
点对点,不适合一条总线挂很多设备
常用于调试串口、GPS、蓝牙、WiFi、4G 模块
常见波特率:9600、115200 等
UART串口中断
这不是一种接口,而是 UART 的软件处理方式。
UART 收发数据时,有两种方式:
轮询:主程序不停查标志位,看有没有收到数据。
中断:收到数据或发送完成时,硬件触发中断,CPU 跳去执行中断函数。
比如 8051 里:
c
void uart_int(void) interrupt 4 { if(RI) uart_rx(); if(TI) uart_tx(); }RI:接收中断标志TI:发送中断标志
好处:不阻塞主程序,实时性更好。
所以“UART串口中断”= 用中断方式处理 UART 收发,不是和 SPI、I2C 并列的硬件接口。
I2C
同步串行、半双工、两线制总线。
两根线:
SCL:时钟SDA:数据
特点:
一根总线上可以挂很多设备
每个设备有唯一地址
速度较慢:100kHz、400kHz、1MHz 等
常用于传感器、EEPROM、小 OLED、RTC
优点:线少,多设备方便。
缺点:速度不如 SPI,总线容易被拉死。
SPI 本身最常见就是 4 线:
text
SCLK, MOSI, MISO, CS但用在LCD/OLED 屏上时,经常说的“4线SPI”是:
text
SCLK, MOSI, CS, DC其中:
DC:数据/命令选择没有
MISO,因为屏幕通常只收不发
“4线SPI”不是另一种协议,而是SPI 的一种接线/使用方式。
“4线ISP”,那它通常指用 4 根线给单片机下载程序,比如:
text
SCK, MOSI, MISO, RESET这是下载方式,不是通信协议。
SPI
同步串行通信接口,全双工,主从结构。
常见 4 根线:
SCLK:时钟MOSI:主机发,从机收MISO:从机发,主机收CS/SS:片选
特点:
速度快,常见几 MHz 到几十 MHz
一主多从,每个从机一个片选
没有地址概念,靠片选选设备
常用于 Flash、SD 卡、传感器、LCD 屏