TI中文支持网
TI专业的中文技术问题搜集分享网站

STM32与LM95071通信问题

TI的工程师:

您好!我用STM32通过SPI口与LM95071通信,一直读不出数据,请问我的SPI口配置是否正确?代码如下:

初始化代码:

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //PB13/14/15复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB

GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PB13/14/15上拉

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; //设置SPI的数据大小:SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//SPI_CPOL_High; //串行同步时钟的空闲状态为高电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
SPI_Init(SPI2, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
SPI_Cmd(SPI2, ENABLE); //使能SPI外设

读数据函数代码:

u16 SPI2_ReadWriteByte16(u16 TxData)
{ u16 retry=0; while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET)
{
retry++;
if(retry>200)return 1;
} SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
retry=0;
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET)
{
retry++;
if(retry>200)return 2;
} return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据}

主函数内读温度:

RxData16=0x0000;
RxData16=SPI2_ReadWriteByte16(RxData16);
printf ("RxData2:%x\r\n",RxData16);

Amy Luo:

您好,
抱歉,关于SPI口配置请您咨询STM32相应技术支持。LM95071读不出数据,可以检查下两芯片通信电平是否兼容,用示波器看下通信时序是否正确,LM95071数据手册8.5.2 Serial Bus Timing Diagrams有读写时序图

user4362815:

回复 Amy Luo:

TI的工程师:
              您好!我在万联芯诚看到一个你们的LM95071的翻译文档,里面有个可以串口测试的电路图,请问此电路图是否可以使用?我接上串口,模拟方波发数据,能收到数据,但是数据都是0,请问是什么原因???(我用串口助手每次发送:55 55 55 55,就会收到 00 00 ,数据均为16进制 )

因为发不了图片,我稳定链接发出来,稳定链接如下(大概第九页有个典型应用电路图):
(典型应用图片内容:Intel196处理器通过串口连接LM95071,Intel196处理器的TX接SC,RX接SI/O)
www.wlxmall.com/…/LM95071CIMFXNOPB-cn-12-id-30713.html

Amy Luo:

回复 user4362815:

我认为是不可以的,LM95071是三线的SPI接口,一个是片选信号。一个输入的时钟信号,还有一个输入输出信号,Intel196处理器应该是用UART接口模拟的SPI接口吧

user4362815:

回复 Amy Luo:

我用普通IO口模拟SPI,SC管脚做了一个文档  LM95071QIMFX-NOPB.pdf  里面  Programming (continued)  章节一模一样的时序,用示波器测SC管脚的波形和你们规格书里面的一样,还是没有数据输出,SI\O管脚要么是高电平要么低电平,测了两个传感器都是这样?请问是什么原因?

user4362815:

回复 Amy Luo:

请问:LM95071过回流焊最高可以耐多高的温度?规格书好像没有介绍这个。

Amy Luo:

回复 user4362815:

您好,可以把您的时序波形图附上来吗

关于回流焊请查看下面文档:

MSL Ratings and Reflow Profiles-spraby1a.pdf

user4362815:

回复 Amy Luo:

我用模拟的SPI口去读取LM95071,单总线读取和双总线都试了,还是读不到温度数据,读出来的数据要么是0,要么是0xFFFF.

我用示波器测芯片引脚的波形,和LM95071QIMFX-NOPB手册的一致,但是还是读不到数据。模拟程序如下,麻烦帮看一下程序是否有问题?

void SPI_Send_Dat(unsigned char dat){ unsigned char n; PB6_Init_out(); delay_us(10); for(n=0;n<8;n++) { SCK=0; delay_us(1); if(dat&0x80)MOSI=1; else MOSI=0; dat<<=1; delay_us(10); SCK=1; delay_us(10); } SCK=0; delay_us(10);

}/*********************************************

*********************************************/unsigned char SPI_Receiver_Dat(void){ unsigned char n ,dat,bit_t; PB6_Init_in(); delay_us(10);

for(n=0;n<8;n++) { SCK=0; dat<<=1; delay_us(10); if(MISO) dat|=0x01; else dat&=0xfe; delay_us(10); SCK=1; delay_us(10); } SCK=0;// delay_us(10); delay_ms(10);

return dat;}

Amy Luo:

回复 user4362815:

抱歉,我这里没法运行您的程序,您可以附上通信的时序波形吗,通过波形可以更直观的判断时序是否正确

Amy Luo:

回复 user4362815:

很高兴您的问题得到解决,感谢您的分享,我想向您确认的是,您是查看的Revision G版本的LM95071手册吗:
www.ti.com.cn/…/lm95071
这个手册F版本到G版本修改了第一页的Temperature Monitor Application图

赞(0)
未经允许不得转载:TI中文支持网 » STM32与LM95071通信问题
分享到: 更多 (0)