stm32 调试 ads7843时读取结果为oxfff

2019-03-23 17:43发布

大家好,这两天在调试tft屏上带的触控功能ic---ADS7843,但是无论用STM32F107的GPIO模拟spi或是SPI3,读出来的数据都是oxfff,请大家帮忙解答一下..... TPCS   --->PB8 TPCLK  -->PC10 TPMOSI -->PC12 TPMISO -->PC11 TPIRQ    -->PC5   /*******************************GPIO模拟方式*********************************/ /*************   H 文件 **************/ #ifndef ADS7843_H
#define ADS7843_H /*********************
CS   :PB8
SCK  :PC10
MOSI :PC12
MISO :PC11
INT  :PC5
*********************/
extern u16 TP_x,TP_y;  #define TP_CS()        GPIO_ResetBits(GPIOB,GPIO_Pin_8)
#define TP_DCS()       GPIO_SetBits(GPIOB,GPIO_Pin_8) #define TP_DCLK2L()    GPIO_ResetBits(GPIOC,GPIO_Pin_10)
#define TP_DCLK2H()    GPIO_SetBits(GPIOC,GPIO_Pin_10) #define TP_DOUT2L()    GPIO_ResetBits(GPIOC,GPIO_Pin_12)
#define TP_DOUT2H()    GPIO_SetBits(GPIOC,GPIO_Pin_12) #define TP_RD_DIN()    GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_11) #define TP_RD_INT()    GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)  
void ADS7843_GPIO_Config(void) ;
void spistar(void);
void WriteCharTo7843(unsigned char num);   
unsigned int ReadFromCharFrom7843(void) ;
void AD7843(void) ; //获取横坐标和纵坐标
#endif   /***************************************/ /*************   C 文件 **************/ #include "stm32f10x.h"
#include "ads7842_gpio.h" void ADS7843_GPIO_Config(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;   //SPI3 Periph clock enable
//       RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);
   //SPI2 Periph clock enable
 // RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE ) ;  //Configure SPI3 pins: SCK, MISO and MOSI
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //推挽输出  SCK MOSI
  GPIO_Init(GPIOC,&GPIO_InitStructure);   //Configure SPI3 pins: SCK, MISO and MOSI
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //推挽输出   TP__CS  
  GPIO_Init(GPIOB,&GPIO_InitStructure);    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;   //上拉输入   MISO
  GPIO_Init(GPIOC,&GPIO_InitStructure);    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;   //上拉输入  TP__PEN IRQ INT
  GPIO_Init(GPIOC,&GPIO_InitStructure);  
} //**********************************************************
void spistar()                                     //SPI开始
{
TP_CS(); //CS=1;
TP_DCLK2H();//DCLK=1;
TP_DOUT2H();//DIN=1;
TP_DCLK2H();//DCLK=1;
}
//**********************************************************
void WriteCharTo7843(unsigned char num)          //SPI写数据
{
unsigned char count=0;
unsigned char tp_in=0;
TP_DCLK2L();//DCLK=0;
for(count=0;count<8;count++)

   tp_in=num&0x80;
     if(tp_in==1) TP_DOUT2H(); //DIN=CY;
  if(tp_in==0) TP_DOUT2L();
   num<<=1;
TP_DCLK2L();//DCLK=0;
__nop();__nop();__nop();                //上升沿有效
TP_DCLK2H();//DCLK=1;
__nop();__nop();__nop(); }
}
//**********************************************************
unsigned int ReadFromCharFrom7843()             //SPI 读数据
{
unsigned char count=0;
unsigned int Num=0;
for(count=0;count<16;count++)
{
  Num<<=1;
  TP_DCLK2H();//DCLK=1;
  __nop();__nop();__nop();                //下降沿有效
  TP_DCLK2L();//DCLK=0;
  __nop();__nop();__nop();
if(TP_RD_DIN())Num++; //if(DOUT) Num++;
}
Num=Num>>3;
return(Num);
}   void AD7843(void)              //获取横坐标和纵坐标
{
 TP_DCS();//CS=0;
//delayms(1);                     //中断后延时以消除抖动,使得采样数据更准确
//while(BUSY);                //如果BUSY信号不好使可以删除不用
//delayms(1);
WriteCharTo7843(0x90);        //送控制字 10010000 即用差分方式读X坐标 详细请见有关资料
//while(BUSY);               //如果BUSY信号不好使可以删除不用
//delayms(1);
TP_DCLK2H();//DCLK=1;
 __nop();__nop();__nop();__nop();
 TP_DCLK2L();//DCLK=0;
 __nop();__nop();__nop();__nop();
TP_y=ReadFromCharFrom7843();
WriteCharTo7843(0xD0);       //送控制字 11010000 即用差分方式读Y坐标 详细请见有关资料
TP_DCLK2H();//DCLK=1;
 __nop();__nop();__nop();__nop();
 TP_DCLK2L();//DCLK=0;
__nop();__nop();__nop();__nop();
TP_x=ReadFromCharFrom7843();
 TP_CS();//CS=1;
}   /***************************************/ /**********************************************************************************/   /*********************************** SPI3 ***************************************/ /*************   H 文件 **************/ #ifndef ADS7843_H
#define ADS7843_H #define TP_CS()      GPIO_ResetBits(GPIOA,GPIO_Pin_4)
#define TP_DCS()     GPIO_SetBits(GPIOA,GPIO_Pin_4)
#define TP_RD_INT()  GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5) // GPIO_PinRemapConfig(GPIO_Remap_SPI1, ENABLE );
 
void SPI_Config(void) ;
unsigned char SPI_WriteByte(unsigned char data);
void SpiDelay(unsigned int DelayCnt);
u16 TPReadX(void);
u16 TPReadY(void); #endif   /***************************************/ /*************   C 文件 **************/ #include "stm32f10x.h"
#include "ads7843_wht.h" void SPI_Config(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  SPI_InitTypeDef   SPI_InitStructure;   //SPI3 Periph clock enable
//       RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);
   //SPI2 Periph clock enable
 // RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE ) ;  //Configure SPI3 pins: SCK, MISO and MOSI
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用推挽输出  SCK MOSI
  GPIO_Init(GPIOC,&GPIO_InitStructure);   //Configure SPI3 pins: SCK, MISO and MOSI
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //推挽输出   TP__CS  
  GPIO_Init(GPIOB,&GPIO_InitStructure);    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;   //上拉输入   MISO
  GPIO_Init(GPIOC,&GPIO_InitStructure);    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;   //上拉输入  TP__PEN IRQ INT
  GPIO_Init(GPIOC,&GPIO_InitStructure);   GPIO_PinRemapConfig(GPIO_Remap_SPI3, ENABLE );  //外设端口重映射 开启   // SPI3 Config 
  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_Low;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;   //SPI_NSS_Hard
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI3,&SPI_InitStructure);   // SPI1 enable 
  SPI_Cmd(SPI3,ENABLE); 
} unsigned char SPI_WriteByte(unsigned char data)
{
 unsigned char Data = 0;    //Wait until the transmit buffer is empty
  while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_TXE)==RESET);
  // Send the byte 
  SPI_I2S_SendData(SPI3,data);    //Wait until a data is received
  while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_RXNE)==RESET);
  // Get the received data
  Data = SPI_I2S_ReceiveData(SPI3);   // Return the shifted data
  return Data;

void SpiDelay(unsigned int DelayCnt)
{
 unsigned int i;
 for(i=0;i<DelayCnt;i++);
} u16 TPReadX(void)
{
   u16 x=0;
   TP_CS();
   SpiDelay(10);
   SPI_WriteByte(0x90);
   SpiDelay(10);
   x=SPI_WriteByte(0x00);
   x<<=8;
   x+=SPI_WriteByte(0x00);
   SpiDelay(10);
   TP_DCS();
   x = x>>3;
   return (x);
} u16 TPReadY(void)
{
 u16 y=0;
  TP_CS();
  SpiDelay(10);
  SPI_WriteByte(0xD0);
  SpiDelay(10);
  y=SPI_WriteByte(0x00);
  y<<=8;
  y+=SPI_WriteByte(0x00);
  SpiDelay(10);
  TP_DCS();
  y = y>>3;
  return (y);
}   /***************************************/   /**********************************************************************************/ GPIO和外设的始终在main文件中已经使能。SPI3是重映射后的引脚。 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。