有用过TSC2046或STM8SPI的兄弟帮忙解答

bg2ifb   2010-8-6 17:24 楼主
大家好,我现在用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;

回复评论 (9)

MCU发命令给TSC2046,2046就采样数据,这时BUSY置高,MCU提供时钟给2046。等BUSY为低后才能读数据。 现在问题是在BUSY时期,我的SPI应该做什么?

11.jpg (72.19 KB)

点赞  2010-8-6 17:54
SPI->DR = numeric[i];
    while(SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);
点赞  2010-8-6 18:08
上楼这个兄弟只是告诉我发数据。。这个我明白。

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;

}
点赞  2010-8-6 18:23
while(!(SPI_SR & 0x20));

这个写错了。应该是  while(!(SPI_SR & 0x02));

各位大虾帮帮忙。
点赞  2010-8-6 19:36
                                 版主大虾,请教一下。
点赞  2010-8-7 09:42
猜想BUSY信号是从设备控制的。

如果是这样的话,这不是常用的SPI协议,无法直接用STM8的SPI模块实现。一种可行的方法是,在BUSY为高时,用程序语句翻转时钟信号,并监视BUSY信号,然后在BUSY变低后再用SPI模块操作。
点赞  2010-8-7 09:58
BUSY位一般带SPI的芯片都会带这个位,表示从设备忙,不交换数据。

而2046这个芯片,我发指令给它,2046芯片ADC采样,转换。这个时间采样,转换时间它会使从设备BUSY。
同时主设备这个时候不能断了时钟。直到BUSY为低电平,MCU才可读从设备的数据。

按版主大虾的说法,我是不是要这样做:
1。起动SPI,发指令给从机,关闭SPI;
2。将SPI_CLK端口模拟输出时间,等待BUSY位为低电平;
3。再起动SPI,读从机ADC数据。
点赞  2010-8-7 10:12
BUSY位一般带SPI的芯片都会带这个位,表示从设备忙,不交换数据。

而2046这个芯片,我发指令给它,2046芯片ADC采样,转换。这个时间采样,转换时间它会使从设备BUSY。
同时主设备这个时候不能断了时钟。直到BUSY为低电平,MCU才可读从设备的数据。

按版主大虾的说法,我是不是要这样做:
1。起动SPI,发指令给从机,关闭SPI;
2。将SPI_CLK端口模拟输出时间,等待BUSY位为低电平;
3。再起动SPI,读从机ADC数据。
基本就是这样。

你说“BUSY位一般带SPI的芯片都会带这个位”,能再多举几个例子吗?不要只说一个厂家的,最好能不同厂家的不同功能的产品,谢谢。
点赞  2010-8-7 10:25
比如:MzLH01-12864模块。就采用SPI通信,带BUSY位

QQ截图未命名1.jpg (29.35 KB)

QQ截图未命名2.jpg (16.4 KB)

点赞  2010-8-9 09:55
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复