OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4317|回复: 7

用STM32F407ZGT6开发板通过SPI通讯模式对ADXL345模块进行通讯

[复制链接]

5

主题

8

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2018-12-5
在线时间
5 小时
发表于 2018-12-6 09:13:04 | 显示全部楼层 |阅读模式
1金钱
STM32F407ZGT6开发板通过SPI通讯模式对ADXL345模块进行通讯

现有元器件:
STM32F407ZGT6  开发板 1
ADXL345   模块  1个
ST-LINK\V2        1个
杜邦线           若干


求源代码    网上找的代码都报错

最佳答案

查看完整内容[请看2#楼]

//================================================================== //函数名: SPI1_Init //功能: SPI1初始化 //参数: 无 //返回值: 无 //日期: 2017-12-27 //================================================================== void SPI1_Init(void) { SPI1_Handler.Instance=SPI1; //SP1 SPI1_Handler.Init.Mode=SPI_MODE_MASTER; //设置SPI工作模式, ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
484
金钱
484
注册时间
2017-11-6
在线时间
162 小时
发表于 2018-12-6 09:13:05 | 显示全部楼层
17771419719 发表于 2018-12-7 09:23
ADXL355的也可以  源程序可以参考参考吗


//==================================================================
//函数名:  SPI1_Init
//功能:   SPI1初始化
//参数:    无
//返回值:  无
//日期:    2017-12-27
//==================================================================
void SPI1_Init(void)
{
        SPI1_Handler.Instance=SPI1;                         //SP1
        SPI1_Handler.Init.Mode=SPI_MODE_MASTER;             //设置SPI工作模式,设置为主模式
        SPI1_Handler.Init.Direction=SPI_DIRECTION_2LINES;   //设置SPI单向或者双向的数据模式:SPI设置为双线模式
        SPI1_Handler.Init.DataSize=SPI_DATASIZE_8BIT;       //设置SPI的数据大小:SPI发送接收16位帧结构
        SPI1_Handler.Init.CLKPolarity=SPI_POLARITY_LOW;     //串行同步时钟的空闲状态为低电平
        SPI1_Handler.Init.CLKPhase=SPI_PHASE_1EDGE;         //串行同步时钟的第一个跳变沿(上升或下降)数据被采样
        SPI1_Handler.Init.NSS=SPI_NSS_SOFT;                 //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
        SPI1_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_16;//定义波特率预分频的值:波特率预分频值为8
        SPI1_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
        SPI1_Handler.Init.TIMode=SPI_TIMODE_DISABLE;        //关闭TI模式
        SPI1_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;//关闭硬件CRC校验
        SPI1_Handler.Init.CRCPolynomial=7;                  //CRC值计算的多项式  
//        SPI1_Handler.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE;  /* Recommanded setting to avoid glitches */
       
       
        if(HAL_SPI_Init(&SPI1_Handler)!= HAL_OK) _Error_Handler(__FILE__, __LINE__);
               
}


//==================================================================
//函数名:  HAL_SPI_MspInit
//功能:   SPI回调函数
//参数:    hspi:SPI句柄
//返回值:  无
//日期:    2017-12-05
//==================================================================
void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
        GPIO_InitTypeDef GPIO_Initure;
        if(hspi->Instance == SPI1)
        {
                __HAL_RCC_SPI1_CLK_ENABLE();
                __HAL_RCC_GPIOA_CLK_ENABLE();
                __HAL_RCC_GPIOC_CLK_ENABLE();

                /**SPI1 GPIO Configuration   
                PA4     ------> SPI1_NSS
                PA5     ------> SPI1_SCK
                PA6     ------> SPI1_MISO
                PA7     ------> SPI1_MOSI
                */               
               
                // PA5 PA6 PA7
                GPIO_Initure.Pin=  GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 ;                        //PA5 PA6 PA7
                GPIO_Initure.Mode=GPIO_MODE_AF_PP;                //复用推挽输出
                GPIO_Initure.Pull=GPIO_NOPULL;                       
                GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;                //高速
                GPIO_Initure.Alternate=GPIO_AF5_SPI1;        //复用为spi1
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);                   //初始化PI       

                //片选信号 PA4
                GPIO_Initure.Pin= GPIO_PIN_4;                        //PA4
                GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;                //推挽输出
                GPIO_Initure.Pull=GPIO_NOPULL;                       
                GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;                //高速
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);                   //初始化PA       
                SPI_CS_HIGH;   //片选取消
               
                //中断引脚  Pc4
                GPIO_Initure.Pin = GPIO_PIN_4;
                GPIO_Initure.Mode = GPIO_MODE_INPUT;       
                GPIO_Initure.Pull=GPIO_PULLDOWN;                       
                GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;                //高速
                HAL_GPIO_Init(GPIOC,&GPIO_Initure);           //初始化PB       

                __HAL_SPI_ENABLE(&SPI1_Handler);    //启动SPI       
               

                SPI1_DMA_Config();  //DMA配置
       
        }
}


//==================================================================
//函数名:  SPI_ADXL355_READ
//功能:   ASXL355 读寄存器
//参数:    adress:寄存器地址
//返回值:  读取寄存器内容
//日期:    2018-1-15
//==================================================================
u8 SPI_ADXL355_READ(u8 adress)
{

        u8 result;
        u8 readadress;
       
        while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4) == RESET);       
        SPI_CS_LOW;                                                

        readadress = adress<<1;
        readadress |= 0x01;
        SPI_ReadWriteByte(readadress);
        result = SPI_ReadWriteByte(0XFF);               

    SPI_CS_HIGH;

        return result;
}

//==================================================================
//函数名:  SPI_ADXL355_WRITE
//功能:   ASXL355 写寄存器
//参数:    adress:寄存器地址  data:写入数据
//返回值:  无
//日期:    2018-1-15
//==================================================================
void SPI_ADXL355_WRITE(u8 adress, u8 data)
{

        u8 writeadress;
               
        while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4) == RESET);
       
    SPI_CS_LOW;
       
        writeadress = adress<<1;
        SPI_ReadWriteByte(writeadress);                //write adress       
        SPI_ReadWriteByte(data);                        //data to be written
       
        SPI_CS_HIGH;
}


关键代码就这些  就是一个简单的SPI而已
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6643
金钱
6643
注册时间
2015-8-25
在线时间
1033 小时
发表于 2018-12-6 13:14:56 | 显示全部楼层
自己写不是更快,只要你照着规格书调试出来,以后你遇到任何的模块你都能一样的写出来
回复

使用道具 举报

2

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
484
金钱
484
注册时间
2017-11-6
在线时间
162 小时
发表于 2018-12-6 15:46:45 | 显示全部楼层
只调过ADXL355和357  应该差不多吧
回复

使用道具 举报

5

主题

8

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2018-12-5
在线时间
5 小时
 楼主| 发表于 2018-12-7 09:22:14 | 显示全部楼层
spica 发表于 2018-12-6 15:46
只调过ADXL355和357  应该差不多吧

本人是小白 刚刚开始接触STM32单片机
回复

使用道具 举报

5

主题

8

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2018-12-5
在线时间
5 小时
 楼主| 发表于 2018-12-7 09:23:06 | 显示全部楼层
spica 发表于 2018-12-6 15:46
只调过ADXL355和357  应该差不多吧

ADXL355的也可以  源程序可以参考参考吗
回复

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2020-5-14
在线时间
20 小时
发表于 2020-5-27 16:51:53 来自手机 | 显示全部楼层
spica 发表于 2018-12-6 09:13
//==================================================================
//函数名:  SPI1_Init
//功 ...

看看有没有用,能不能起作用
回复

使用道具 举报

14

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2015-8-4
在线时间
38 小时
发表于 2020-10-18 22:24:53 | 显示全部楼层
我也在调adxl355,遇到一个问题,SPI可以读寄存器,但不能写;我先读取只读寄存器然后串口输出,可以得到寄存器的默认值,对于可读写寄存器,写入之后再读取发现数值没变,写入之前先读取,写入之后再读取一次,两次的之是一样的,请各位各位是什么原因?使用的是探索者的板子,按照例程修改的,SPI的参数也参照adxl355的文档修改了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-29 23:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表