标题:
STM32的SPI接口应用问题?无法驱动XPT2046
[打印本页]
作者:
远征之路
时间:
2018-9-25 17:32
标题:
STM32的SPI接口应用问题?无法驱动XPT2046
各位大神:
如题,本人使用STM32F103的SPI2 想驱动XPT2046(使用这个芯片的ADC功能),但是在SPI2配置与硬件接线均没有问题的情况下,结果依然无法驱动,自认为是最终MY_FINAL()转换函数出现了问题,但不知道问题在哪里?
另外有几点疑惑,还请各位大神帮忙看看:
1、既然使用了STM32的SPI2 接口,那么在编程时需要使用时钟吗?如下 u16 MY_FINAL(u8 cha) 函数
2、各位是否有类似的程序,让小弟借鉴借鉴,谢谢
#include "stm32f10x.h"
#include "led.h"
#include "xpt.h"
#include "delay.h"
#include "my_spi.h"
#define MY_CHANNEL 0xA4 //XPT2046通道一的控制寄存器
//AD_XPT2046转换功能函数
u16 MY_FINAL(u8 cha)
{
u16 MY_VAL=0;
MY_SCLK=0;
MY_CS=0; //选中XPT2046
SPI2_ReadWriteByte(cha);
// SPI2_ReadWriteByte(0x00);
// SPI2_ReadWriteByte(0x00);
// SPI2_ReadWriteByte(0x00);
delay_us(6);
MY_SCLK=1;
delay_us(1);
MY_SCLK=0;
MY_VAL |= SPI2_ReadWriteByte( 0xff ) << 8 ; //按照一个字节由高位到低位进行传送,所以先转换完毕的高8位需要左移
MY_VAL |= SPI2_ReadWriteByte(0xff); //后8位直接与之前的值相或
MY_VAL >>= 4 ; //只有高12位有效,所以右移4位
// AD_XPT_WRITE(cha);
//
// delay_us(6);//ADS7846和xpt2046效果一致;转换时间最长为6us
//
// delay_us(1);//delays 1us equals _nop_()
//
// MY_VAL = AD_XPT_READ();
MY_CS=1;
return MY_VAL;
}
//main()函数
int main(void)
{
u16 YOYO_VAL;
delay_init();
LED_MY_Init();
AD_XPT_Init_MY(); //已经包含了SPI2 的初始化
SPI2_Init();
while(1)
{
YOYO_VAL = MY_FINAL(MY_CHANNEL);
if(YOYO_VAL>10) //当AD采集的等效值大于10时,LED被点亮
{
LED_YE = 0;
}
else LED_YE = 1;
}
}
复制代码
作者:
hange_v
时间:
2018-9-25 20:08
static void gpioInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_3);
}
static void spiInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE);
//PA4->CS
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//PA5->SCK,PA6->MISO,PA7->MOSI
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_SSOutputCmd(SPI1, ENABLE);
SPI_Cmd(SPI1, ENABLE);
}
static void spiEN(void)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
}
static void spiDIS(void)
{
GPIO_SetBits(GPIOA, GPIO_Pin_4);
}
static void spiWriteByte(u8 TxData)
{
while((SPI1->SR & SPI_I2S_FLAG_TXE) == 0); //等待发送区空
SPI1->DR = TxData; //发送一个byte
while((SPI1->SR & SPI_I2S_FLAG_RXNE) == 0); //等待接收完一个byte
SPI1->DR;
}
static u8 spiReadByte(void)
{
while((SPI1->SR & SPI_I2S_FLAG_TXE) == 0); //等待发送区空
SPI1->DR = 0xFF; //发送一个空数据产生输入数据的时钟
while((SPI1->SR & SPI_I2S_FLAG_RXNE) == 0); //等待接收完一个byte
return SPI1->DR;
}
作者:
洲51hei
时间:
2018-9-25 21:15
一般是时序出了问题,最好买一个逻辑分析仪监视一下数据,便宜的分析仪几十元人民币,某宝上就有这种分析仪
作者:
洲51hei
时间:
2018-9-25 21:18
一般是程序时序有问题,到某宝上买一个数据逻辑分析仪,几十元人民币,测一下数据就知道你错在哪里了。
作者:
远征之路
时间:
2018-9-26 12:17
hange_v 发表于 2018-9-25 20:08
static void gpioInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
大神,XPT2046驱动具体完整时序有吗?另外,既然使用了STM32的SPI2 接口,那么在编程时(即编写XPT2046完整驱动程序)时需要使用时钟吗? 谢谢
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1