本帖最后由 Ace3500 于 2017-6-8 14:30 编辑
如题,如题,这两天用STM32F103C8T6采集ATT7053BU的数据,结果采集上来的数据始终固定不变,我传不同的寄存器地址,他的数据都不变,跪求懂得大神来围观围观,知道知道小弟,感激不尽!
这是我的代码的主要部分,最下面是main函数。
附图是我用串口发出来以后全是一样的数据,附件是我的工程。
跪求大神帮忙看看。 |
- /**********************************************************************
- //函数名称:Init_ATT7053(void)
- //功能 :初始化ATT7053
- **********************************************************************/
- void Init_ATT7053(void)
- {
- int j;
-
- SPI_configuration();
-
- GPIO_ResetBits(CS_PORT, CS_PIN); //片选拉低
- for (j=50; j>0; j--);
- GPIO_SetBits(CS_PORT, CS_PIN); //片选拉高
- for (j=50; j>0; j--);
-
- SPI_Write(0x33,0x0055); //0x33:软件复位寄存器。0x55:复位
- SPI_Write(0x40,0x2000); //0x40:EMU配置寄存器。0x2000:bit13=1,能量寄存器读后清零
- SPI_Write(0x43,0x0007); //ADC开关寄存器,I1,I2,U全部打开
-
- SPI_Write(0x59,0x0001); //设置电流 电压增益
- SPI_Write(0x41,0x0000); //设置电流 电压增益 -------------->0x41,page28,时钟配置寄存器
- }
复制代码- //写函数
- void SPI_Write(u8 address, u32 write_data)
- {
- char i;
- int j;
- u32 temp_data = 1;
-
- GPIO_SetBits(CS_PORT, CS_PIN);
- for (j=50; j>0; j--);
- GPIO_ResetBits(SCLK_PORT, SCLK_PIN); //确保CLK初始状态是0
- for (j=50; j>0; j--);
- GPIO_ResetBits(CS_PORT, CS_PIN); //片选置0,生效
-
- address=address|0x80;
- for(i=8; i>0; i--)
- {
- GPIO_SetBits(SCLK_PORT, SCLK_PIN);
- for (j=50; j>0; j--);
-
- if(((address & (0x01<<(i-1)))>>(i-1))) //address 地址从0x00到0x7F
- {
- GPIO_SetBits(SDI_PORT, SDI_PIN); //1表示主机向从机写数据
- for (j=50; j>0; j--);
- }
- else
- {
- GPIO_ResetBits(SDI_PORT, SDI_PIN);
- for (j=50; j>0; j--);
- }
-
- GPIO_ResetBits(SCLK_PORT, SCLK_PIN); //从机需要在下降沿取数据
- for (j=50; j>0; j--);
- }
-
- for (j=50; j>0; j--);
-
- for(i=23;i>0;i--)
- {
- GPIO_SetBits(SCLK_PORT, SCLK_PIN);
- for (j=50; j>0; j--);
-
- if(((write_data & (temp_data<<i))>>i)) //address 地址从0x00到0x7F
- {
- GPIO_SetBits(SDI_PORT, SDI_PIN);
- for (j=50; j>0; j--);
- }
- else
- {
- GPIO_ResetBits(SDI_PORT, SDI_PIN);
- for (j=50; j>0; j--);
- }
-
- GPIO_ResetBits(SCLK_PORT, SCLK_PIN); //从机需要在下降沿取数据
- for (j=50; j>0; j--);
- }
- GPIO_SetBits(CS_PORT, CS_PIN);
-
- }
复制代码- //读函数
- u32 SPI_Read(u8 address)
- {
- char i;
- int j;
- u32 temp_data;
- u32 miso_val;
-
- temp_data = 0;
-
- GPIO_SetBits(CS_PORT,CS_PIN); //片选初始状态为1
- for (j=50; j>0; j--);
- GPIO_ResetBits(SCLK_PORT, SCLK_PIN); //确保CLK初始状态是0
- for (j=50; j>0; j--);
- GPIO_ResetBits(CS_PORT, CS_PIN); //片选置0,生效
- for (j=50; j>0; j--)
- {
-
- }
-
- address=address&0x7F;
- for(i=8; i>0; i--)
- {
- GPIO_SetBits(SCLK_PORT, SCLK_PIN); //CLK置高
- for (j=50; j>0; j--);
-
- if( (address & ( 0x01<<(i-1) )) >> (i-1) ) //address 地址从0x00到0x7F
- {
- GPIO_SetBits(SDI_PORT, SDI_PIN); //1表示主机向从机写数据
- }
- else
- {
- GPIO_ResetBits(SDI_PORT, SDI_PIN);
- }
- for (j=50; j>0; j--);
- GPIO_ResetBits(SCLK_PORT, SCLK_PIN); //CLK置低(下降沿),从机需要在下降沿取数据
- for (j=50; j>0; j--);
- }//从机接收到命令后,开始送出数据,上升沿送数据
- for(i=24; i>0; i--)
- {
- GPIO_SetBits(SCLK_PORT, SCLK_PIN); //
-
- if(GPIO_ReadInputDataBit(SDO_PORT, SDO_PIN))
- miso_val=0x01;
- else
- miso_val=0x00;
-
- temp_data = temp_data|(miso_val<<(i-1));
- for (j=50; j>0; j--);
- GPIO_ResetBits(SCLK_PORT, SCLK_PIN); //从机需要在下降沿取数据
- for (j=50; j>0; j--);
- }
- GPIO_SetBits(CS_PORT, CS_PIN);
-
- return temp_data;
- }
复制代码 |
STM32的硬件SPI也挺好用的。
评分
查看全部评分
谢谢你,我测了一下,如图: CS和CLK正常,
DOUT和DIN感觉不太正常。
现在的话我该检查哪里有问题呢?感觉现在没有方向了。
DIN是SDI吗?怎么输出基本上是低电平啊。
先想办法把SDI调正确吧。是不是外围设备接的不对把SDI拉低了?
我也是个菜鸟,不过STM32的SPI的话,还是试过的。
你可以先试试用SPI发送简单的重复的数据,判断下SDI波形异常的原因。
先分析下可能是硬件的问题还是软件的问题?
硬件问题的话,会不会是ATT7053BU接的有问题将SDI拉低了?可以不焊ATT7053BU看下SDI波形是否正确,还不行的话,可外接个上拉电阻再试下。
以上是我想到的,不一定对,供参考。
单步调试DOUT输出的全是F,示波器测出来的也全都是高,一致。看来可能还是软件有问题,我再看看。
恩恩,DIN是SDI,我也奇怪为什么只是高电平了一下,就全部低了,我试试你说的方法。谢谢哈。
刚分析代码,又感觉好像没问题,因为我的main函数里就这句:
传的寄存器地址是0x08,也就是0000 1000,所以SDI口接收寄存器地址的时候确实是只有一个高电平,其余的全部都是低。
我把传入的寄存器地址随便改了个0x53,也就是0101 0011,然后再观察SDI的波形,就变成了这样:
所以说DIN口应该没问题吧?
还有一个问题:就是我不管传什么地址,SDO接收到的数据永远是全F,全高电平。这个我不知道为什么会这样。
方向:验证读写数据是否正常。
数据读取的验证:直接读chipID,看返回值是否正确,来验证读取的时序。
数据写的验证:写-读ANAE寄存器,然读到的值与你写的是否一致。
举个栗子,初始化可以只配置这些。
void ATT7053_Init()
{
ATT7053_Reset();
ATT7053_wEnable40H45H();
//EMU配置寄存器(EMUCFG)EnergyClr 设置是否能量寄存器读后清0(0:读后不清0; 1:读后清0)
u32 readValue= ATT7053_Read(ATT7053_RW_EMUCFG);
while ((readValue & 0x2000) == 0)
{
ATT7053_Write(ATT7053_RW_EMUCFG, readValue | 0x2000);
readValue= ATT7053_Read(ATT7053_RW_EMUCFG);
}
ATT7053_SelectChannel(1);
ATT7053_wDisable();
}
评分
查看全部评分