STM32 SPI 访问传感器 ( SCA100T & MS5803 ),头大啊,好几天了!!!

keith_cheung 2014-09-03 06:08:55
我在用 STM32F103R 通过 SPI(1) 访问传感器 : SCA100T(倾角) & MS5803 (气压),一直不成功。
头都大了,有人用过这二种传感器么?能否给个例程给我?

谢谢!


下面是我用来访问 SCA100T 的部份程序:

#define MEAS 0x00 //测量模式
#define RWTR 0x08 //读写温度数据寄存器
#define STX 0x0E //x通道自检
#define STY 0x0F //Y通道自检
#define RDAX 0x10 //读X通道加速度值
#define RDAY 0x11 //读Y通道加速度值
//........................

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_SPI1, ENABLE);

GPIO_InitTypeDef GPIO_InitStructure;

/* Configure SPI_MASTER pins: NSS, SCK and MOSI */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;//SPI_MASTER_PIN_NSS | SPI_MASTER_PIN_SCK | SPI_MASTER_PIN_MOSI;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);

// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
// GPIO_Init(GPIOA, &GPIO_InitStructure);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//NSS
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;//控制 CSB 及其它
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(GPIOC, &GPIO_InitStructure);




GPIO_ResetBits(GPIOA, GPIO_Pin_4 );
/* SPI_MASTER configuration ------------------------------------------------------*/
SPI_Cmd(SPI1, DISABLE); //必须先禁能,才能改变MODE

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI_Direction_1Line_Tx;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
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_16;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);

//...............................

GPIO_ResetBits(GPIOC, GPIO_Pin_0);//低电平控制 CSB

/* Wait for SPI_MASTER Tx buffer empty */
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
/* Send SPI_MASTER data */
SPI_I2S_SendData(SPI1, (uint8_t)MEAS);

/* Wait for SPI_MASTER Tx buffer empty */
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
/* Send SPI_MASTER data */
SPI_I2S_SendData(SPI1, (uint8_t)RDAX);//读X轴

Delay(1);

/* Wait for SPI_MASTER Tx buffer empty */
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
Uart_RX_Buffer = SPI_I2S_ReceiveData(SPI1);//得到结果???还是要如何做???

GPIO_SetBits(GPIOC, GPIO_Pin_0 );
...全文
1197 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
keith_cheung 2015-08-27
  • 打赏
  • 举报
回复
不使用它了,直接用 STM32 ADC
creepsl 2015-08-07
  • 打赏
  • 举报
回复
引用 7 楼 creepsl 的回复:
SCA100T是规则的spi通讯,所以好像得用软件模拟spi通讯方式,然后它的高位是在前面的,
说错了说错了,它是不规则的spi通讯,写寄存器是八位的,温度读出来也是八位的,但是两个轴的加速度是11位的。
creepsl 2015-08-07
  • 打赏
  • 举报
回复
SCA100T是规则的spi通讯,所以好像得用软件模拟spi通讯方式,然后它的高位是在前面的,
changing_better 2014-12-23
  • 打赏
  • 举报
回复
这些东西都是时序问题,可以先读下这些传感器的固定寄存器里的固定值看看,是否SPI通信正常。
worldy 2014-12-08
  • 打赏
  • 举报
回复
连接好电路,一般需要5线连接(MISO,MOSI,CLK,CS,GND) 发出片选信号 准备好数据 发送时钟 时间回复 数据下一个数据 ..... 撤除片选信号
色郎中 2014-12-08
  • 打赏
  • 举报
回复
SPI 通信OK了,就应该问题不大了 你到大虾论坛找一下大虾开发板,应该是和你这个型号一样的
keith_cheung 2014-12-07
  • 打赏
  • 举报
回复
来多几个,要加分结贴了。
keith_cheung 2014-09-11
  • 打赏
  • 举报
回复
引用 1 楼 woshi_ziyu 的回复:
http://www.pudn.com/search_db.asp?keyword=SCA100T 可以下载一些例程参考一下
最讨厌 pudn 了,不能随意下载。 不过,也谢谢你!
woshi_ziyu 2014-09-04
  • 打赏
  • 举报
回复
http://www.pudn.com/search_db.asp?keyword=SCA100T 可以下载一些例程参考一下

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧