2019-07-21 04:57发布
chenguozeng 发表于 2017-1-12 16:03 ATT7053BU是5V的,3.3V要选择ATT7053AU。 我有自己写了驱动代码,,有需求回复我就可以
最多设置5个标签!
我按照你给我发的代码修改了下,改到这里发现了一些地方看不懂,你能再麻烦你帮我再看看吗?非常感谢。
附图是读取数据时序图
因为想要读数据,所以我先修改了读取函数:
[mw_shl_code=c,true]//这是我定义的引脚宏
#define ATT7053BU_CS GPIO_Pin_4
#define ATT7053BU_CS_PORT GPIOA
#define ATT7053BU_CLK GPIO_Pin_5
#define ATT7053BU_CLK_PORT GPIOA
#define ATT7053BU_DOUT GPIO_Pin_6
#define ATT7053BU_DOUT_PORT GPIOA
#define ATT7053BU_DIN GPIO_Pin_7
#define ATT7053BU_DIN_PORT GPIOA[/mw_shl_code]
[mw_shl_code=c,true]u32 SPI_Read(uint8_t address){ int i;
u32 temp_data = 0;
//SPI_CLK = 0; CLK初始状态为0
GPIO_ResetBits(ATT7053BU_CLK_PORT, ATT7053BU_CLK);//GPIO_ResetBits(GPIOA, GPIO_Pin_5);
Delay(1);
//SPI_CLK = 1; 电平拉高
GPIO_SetBits(ATT7053BU_CLK_PORT, ATT7053BU_CLK);
Delay(2);
//CS = 0; 片选置0,使生效
GPIO_ResetBits(ATT7053BU_CS_PORT, ATT7053BU_CS);
Delay(5);
//SPI_CLK = 1; //高电平,启动数据传输
GPIO_SetBits(ATT7053BU_CLK_PORT, ATT7053BU_CLK);
Delay(1);
//------------------------------------------------------- //这里为什么要把DIN置0没看懂
GPIO_ResetBits(ATT7053BU_DIN_PORT, ATT7053BU_DIN);
Delay(1);
//时钟引脚拉低,置0
GPIO_ResetBits(ATT7053BU_CLK_PORT, ATT7053BU_CLK);
Delay(1);
//----->这段循环没看懂,不知道是不是我注释的这些意思
//首先这段代码意思是:把数据放入读取数据寄存器?
//8bit命令 == 1bit读写标志(最高位) + 7bit要访问的内存地址
address = address | 0x7F; //得到低7位(要存放数据的寄存器地址),并且:最高位为0,表示读数据。
for(i=7; i>=0; i--)
{
//上升沿,进循环之前CLK是低电平,循环结尾也是低电平。---->给上升沿是因为在上升沿传输数据
//SPI_CLK = 1; //给高电平,启动数据传输
GPIO_SetBits(ATT7053BU_CLK_PORT, ATT7053BU_CLK);
Delay(1);
//这段if也看不懂
//一开始以为条件中是:获取了address的最高位(读写指示位),然后右移到最低位,可后来发现为什么是i呢?每次循环获取第i位是什么意思?
if(((address & (0x01<<(i-1)))>>(i-1))) //address 地址从0x00到0x7F
{
GPIO_SetBits(SDI_PORT, SDI_PIN); //1表示主机向从机写数据
}
else
{
GPIO_ResetBits(SDI_PORT, SDI_PIN);
}
//SPI_CLK = 0; //置0,因为要在下次循环时有上升沿,上升沿传输数据
GPIO_ResetBits(ATT7053BU_CLK_PORT, ATT7053BU_CLK);
Delay(1);
}//从机接收到命令后,开始送出数据,上升沿送数据
Delay(2);
//置高
//SPI_CLK = 1;
GPIO_SetBits(ATT7053BU_CLK_PORT, ATT7053BU_CLK);
Delay(1);
//SPI_CLK = 0;下降沿读取数据
GPIO_SetBits(ATT7053BU_CLK_PORT, ATT7053BU_CLK);
temp_data = temp_data | ATT7053BU_DOUT; //读取最低位(第0bit)数据
Delay(1);
//读取剩下的 第1bit到23bit 数据
for(i=1; i<=23; i++)
{
//SPI_CLK = 1; 置高
GPIO_SetBits(ATT7053BU_CLK_PORT, ATT7053BU_CLK);
Delay(1);
//SPI_CLK = 0; 下降沿读取数据
GPIO_ResetBits(ATT7053BU_CLK_PORT, ATT7053BU_CLK);
Delay(1);
//读取数据
temp_data = (temp_data<<1) | ATT7053BU_DOUT;
}
//SPI_CS = 1;片选信号拉高,结束SPI数据读取
GPIO_SetBits(ATT7053BU_CLK_PORT, ATT7053BU_CLK);
return temp_data;
}
[/mw_shl_code]
一周热门 更多>