大家好,我现在用STM8与TSC2046 进行SPI通信,读触摸屏的坐标。
现在我要端口模拟SPI已与TSC2046进行正常通信,但现在想用自有的SPI模块与其通信,但是老是不行。请教一下各位大虾。最好能提供代码供学习,谢谢!!!
我的SPI初始化:MCU为主模式,MISO,MOSI。两路全双工。
CLK_PCKENR1 |= 0x02;
SPI_CR1 = 0x10;
SPI_CR2 = 0x03;
SPI_ICR = 0x00;
SPI_CR1 |= 0x40;
MCU发命令给TSC2046,2046就采样数据,这时BUSY置高,MCU提供时钟给2046。等BUSY为低后才能读数据。 现在问题是在BUSY时期,我的SPI应该做什么?
-
-
11.jpg
(72.19 KB)
SPI->DR = numeric[i];
while(SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);
上楼这个兄弟只是告诉我发数据。。这个我明白。
SPI_CS 是定义了端口输出。控制2046,自身作主模式用软件控制。
unsigned char temp;
void Read_2046(void)
{
SPI_CS = 0; //MCU主模式是软件控制,这只脚控制2046的CS。
SPI_DR = 0X90;
while(!(SPI_SR & 0x20));
接下来就是BUSY等待了,这个时候时钟不能停的,看上图。这个地方我不知道写
????
然后读数据
SPI_DR = 0x00;
while(!(SPI_SR & 0x20));
temp = SPI_DR;
}
while(!(SPI_SR & 0x20));
这个写错了。应该是 while(!(SPI_SR & 0x02));
各位大虾帮帮忙。
猜想BUSY信号是从设备控制的。
如果是这样的话,这不是常用的SPI协议,无法直接用STM8的SPI模块实现。一种可行的方法是,在BUSY为高时,用程序语句翻转时钟信号,并监视BUSY信号,然后在BUSY变低后再用SPI模块操作。
BUSY位一般带SPI的芯片都会带这个位,表示从设备忙,不交换数据。
而2046这个芯片,我发指令给它,2046芯片ADC采样,转换。这个时间采样,转换时间它会使从设备BUSY。
同时主设备这个时候不能断了时钟。直到BUSY为低电平,MCU才可读从设备的数据。
按版主大虾的说法,我是不是要这样做:
1。起动SPI,发指令给从机,关闭SPI;
2。将SPI_CLK端口模拟输出时间,等待BUSY位为低电平;
3。再起动SPI,读从机ADC数据。
BUSY位一般带SPI的芯片都会带这个位,表示从设备忙,不交换数据。
而2046这个芯片,我发指令给它,2046芯片ADC采样,转换。这个时间采样,转换时间它会使从设备BUSY。
同时主设备这个时候不能断了时钟。直到BUSY为低电平,MCU才可读从设备的数据。
按版主大虾的说法,我是不是要这样做:
1。起动SPI,发指令给从机,关闭SPI;
2。将SPI_CLK端口模拟输出时间,等待BUSY位为低电平;
3。再起动SPI,读从机ADC数据。
基本就是这样。
你说“BUSY位一般带SPI的芯片都会带这个位”,能再多举几个例子吗?不要只说一个厂家的,最好能不同厂家的不同功能的产品,谢谢。
比如:MzLH01-12864模块。就采用SPI通信,带BUSY位
-
-
QQ截图未命名1.jpg
(29.35 KB)
-
-
QQ截图未命名2.jpg
(16.4 KB)