本帖最后由 乐此不疲 于 2023-5-19 21:19 编辑
多谢指点,我用STC8H8K64U(开天斧实验板)做硬件SPI通讯测试时遇到一个问题,好几天没有理出头绪,希望帮忙看看我的代码哪里弄错了,先谢了!
我实验用到TFT-LCD的驱动是ILI9481,他是三线SPI,要求数据中包含一位指令/数据(D/CX控制)的命令,也就是传输的字节为9位的数据,我曾经在本坛发帖分享过用硬件SPI以查询方式每次发送两个字节的方法的驱动方法,原帖:开天斧三.1板测试——硬件SPI驱动三线SPI_TFT屏(代码分享)https://www.stcaimcu.com/forum.php?mod=viewthread&tid=1091(出处: 国芯论坛-STC全球32位8051爱好者互助交流社区)
此贴之后我又实验了I/0模拟输出一个脉冲+以查询方式发送8位字节数据的模式,实验也很成功,在时钟设定为40mhz状态下刷屏很爽很稳定。接下来我继续测试用硬件SPI以中断的方式来驱动这个屏幕,结果调试了很久也没能成功刷屏,请帮忙看看。
没有调试成功的代码如下:
- //====硬件SPI初始化函数=========================
- void spi_init()
- {
- u8 n;
- n = 2; //分频系数n取值0、1、2、3对应的时钟分频系数为:1/4、1/8、1/16、1/2
- P_SW1|= 0x01<<2;//使用SPI通道2
- P2PU = 0x2A; //SDA、SCL、CS端口配置内部上拉电阻(4.1K)
- P2M1 = 0x00;
- P2M0 = 0x2A;
- SPDAT = 0; //清空数据寄存器
- SPSTAT = 0xC0; //清除所有标志(共两个)
- SPCTL = 0x9C|(n);//忽略SS、禁止SPI、高位先行、主机模式、时钟空闲时为高、上升沿(第二个边沿)采样、1/16时钟分频
- IE2 = ESPI;
- busy = 0;
- cs = 1;
- }
- //====写8位数据函数============================
- //中断方式
- void SPI_WriteByte(u8 temp)
- {
- SPI_Enable(); //使能硬件SPI
- NOP1();
- SPDAT = temp; //发送数据
- busy=1; //保持发送状态
- while(busy);
-
- /*
- if(busy==0) //判断总线状态
- {
- busy=1; //保持发送状态
- SPDAT = temp; //发送数据
- }
- else
- {
- sda=1; //释放总线
- scl=1;
- cs= 1; //挂断从机
- }
- */
- }
- //==============写指令函数======================
- void write_command(u8 comd)
- {
- cs=0; //使能从机响应
- sda=0; //D/CX=0(发送指令)
- NOP1();
- scl=0; //模拟一个下跳时钟脉冲
- NOP1(); //适当延时保障脉冲宽度
- scl=1; //拉高时钟线恢复空闲状态
- NOP1();
- sda=1; //释放总线
- SPI_WriteByte(comd);//使能硬件SPI发送一个字节
- }
- //==============写数据函数======================
- void write_data(u8 dat)
- {
- cs=0; //使能从机响应
- sda=1; //D/CX=1(发送数据)
- NOP1();
- scl=0; //模拟一个下跳时钟脉冲
- NOP1(); //适当延时保障脉冲宽度
- scl=1; //拉高时钟线恢复空闲状态
- NOP1();
- SPI_WriteByte(dat);//使能硬件SPI发送一个字节
- }
- //====SPI中断函数=================================
- void SPI_Isr() interrupt 9
- {
- busy=0;
- SPSTAT = 0xc0; //中断发生时一个字节数据已经发送完毕、清中断标志等待下一次触发
- SPI_Disable();//禁止硬件SPI
- sda=1;
- scl=1;
- cs= 1;
- }
-
复制代码
|