哎 终极帖 为什么加上这个就不给我过!!

2019-07-20 17:23发布

///////////////////////////////////
// 对ADXL345 进行I2C中断的形式采样信号
//
//////////////////////////////////
#include "adrec.h"
#include "delay.h"
#define   uchar unsigned char
#define   uint unsigned int
#define SlaveAddress   0xA6   //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
#define SDA GPIO_Pin_3
#define SCL GPIO_Pin_2
uchar BUF[6];
void IIC_Init( void)
{
  EXTI_InitTypeDef   EXTI_InitStructure;     //外部中断配置表
  GPIO_InitTypeDef  GPIO_InitStructure;        //建立 GPIOA初始化函数入口参数
NVIC_InitTypeDef NVIC_InitStructure;          //嵌套向量中断配置结构体

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟


    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource1);//PA1 连接到中断线1   

   /* 配置EXTI_Line0 */
  EXTI_InitStructure.EXTI_Line = EXTI_Line1;//LINE1
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE1
  EXTI_Init(&EXTI_InitStructure);//配置


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT   ;   //  
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;    //  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN   ;   //  什么模式??  I2C的中断
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;    //  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;  
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  NVIC_InitStructure.NVIC_IRQChannel= EXTI1_IRQn  ;             //         /*!< EXTI Line1 Interrupt                                              */
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级1
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2 ; //相应优先级 为2
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  // IRQ通道使能
  NVIC_Init( &NVIC_InitStructure) ; //根据上面指定参数初始化NVIC寄存器
  
  Init_ADXL345();
}   
//外部中断函数
void EXTI1_IRQHandler(void)
{

u8 t;
USART_SendData(USART1, 3);  
  Multiple_read_ADXL345();
for(t=0;t<2;t++)
   {
    USART_SendData(USART1, 2);  
    USART_SendData(USART1, BUF[t]);         //向串口1发送数据
    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
   }
  EXTI_ClearITPendingBit(EXTI_Line1); //清除LINE1上的中断标志位

}
void IIC_Start(void)
{
SDA_OUT();     //sda线输出
IIC_SDA=1;      
IIC_SCL=1;
delay_us(4);
  IIC_SDA=0;//START:when CLK is high,DATA change form high to low
delay_us(4);
IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}   
//产生IIC停止信号
void IIC_Stop(void)
{
SDA_OUT();//sda线输出
IIC_SCL=0;
IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
  delay_us(4);
IIC_SCL=1;
IIC_SDA=1;//发送I2C总线结束信号
delay_us(4);           
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN();      //SDA设置为输入  
IIC_SDA=1;delay_us(1);   
IIC_SCL=1;delay_us(1);  
while(READ_SDA)
{
  ucErrTime++;
  if(ucErrTime>250)
  {
   IIC_Stop();
   return 1;
  }
}
IIC_SCL=0;//时钟输出0     
return 0;  
}
//产生ACK应答
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
//不产生ACK应答      
void IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}               
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答     
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
SDA_OUT();      
    IIC_SCL=0;//拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {              
        IIC_SDA=(txd&0x80)>>7;
        txd<<=1;   
  delay_us(2);   //对TEA5767这三个延时都是必须的
  IIC_SCL=1;
  delay_us(2);
  IIC_SCL=0;
  delay_us(2);
    }  
}      
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 IIC_Read_Byte(void)
{
unsigned char i,receive=0;
SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
{
        IIC_SCL=0;
        delay_us(2);
  IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)receive++;   
  delay_us(1);
    }      
//    if (!ack)
//        IIC_NAck();//发送nACK
//    else
//        IIC_Ack(); //发送ACK   
    return receive;
}
void Init_ADXL345()
{
   //Single_Write_ADXL345(0x38,0x20);    //FIFO模式
   Single_Write_ADXL345(0x31,0x08);   //测量范围,正负16g,13位模式      正负2g 13位
   Single_Write_ADXL345(0x2C,0x0C);   //速率设定为12.5 参考pdf13页      400 HZ
   Single_Write_ADXL345(0x2D,0x08);   //选择电源模式   参考pdf24页
   Single_Write_ADXL345(0x2E,0x81);   //使能 DATA_READY 中断            使能OVERRUN中断
   Single_Write_ADXL345(0x2F,0x01);    //对OVERRUN设置INT2
   Single_Write_ADXL345(0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入pdf29页
   Single_Write_ADXL345(0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入pdf29页
   Single_Write_ADXL345(0x20,0xC7);   //Z 偏移量 根据测试传感器的状态写入pdf29页
}
void Single_Write_ADXL345(uchar REG_Address,uchar REG_data)
{
IIC_Start();              //起始信号
  IIC_Send_Byte(SlaveAddress);   //发送设备地址+写信号
  IIC_Send_Byte(REG_Address);    //内部寄存器地址,请参考中文pdf22页
   IIC_Send_Byte(REG_data);      //内部寄存器数据,请参考中文pdf22页
IIC_Stop()   ;             //发送停止信号
}

uchar Single_Read_ADXL345(uchar REG_Address)
{  uchar REG_data;
    IIC_Start();                        //起始信号
  IIC_Send_Byte(SlaveAddress)  ;         //发送设备地址+写信号
   IIC_Send_Byte(REG_Address)  ;             //发送存储单元地址,从0开始
  IIC_Start() ;                         //起始信号
   IIC_Send_Byte(SlaveAddress+1)  ;        //发送设备地址+读信号
    REG_data=IIC_Read_Byte();              //读出寄存器数据
  IIC_Ack();
IIC_Stop() ;                         //停止信号
    return REG_data;
}
void Multiple_read_ADXL345(void)
{   uchar i;
    IIC_Start();                            //起始信号
    IIC_Send_Byte(SlaveAddress)  ;             //发送设备地址+写信号
   IIC_Send_Byte(0x32) ;                   //发送存储单元地址,从0x32开始
     IIC_Start()   ;                         //起始信号
    IIC_Send_Byte(SlaveAddress+1)  ;        //发送设备地址+读信号
  for (i=0; i<6; i++)                      //连续读取6个地址数据,存储中BUF
    {
        BUF[i] =  IIC_Read_Byte();          //BUF[0]存储0x32地址中的数据
        if (i == 5)
        {
          IIC_Ack();                //最后一个数据需要回NOACK
        }
        else
        {
         IIC_NAck();                //回应ACK
       }
   
   }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。