我想利用M4到的I2C模块2对DAC8571进行控制,先对DAC8571进行控制输入数据,然后从DAC8571内读出刚写入的数据。可读回来的全是0,并且DAC8571的输出结果也不是我想要的.这是什么情况?
/*********************************************************************************************
PE4对应着的是sclk,PE5对应的是sda.使用的SSI2模块。
**********************************************************************************************/
#include<stdint.h>
#include<stdbool.h>
#include"driverlib/sysctl.h"
#include"driverlib/interrupt.h"
#include"driverlib/gpio.h"
#include"driverlib/i2c.h"
#include"inc/hw_types.h"//内有HWREG的相关定义
#include"inc/hw_memmap.h"//内有各种BASE的定义
#include"inc/hw_ints.h"//内有各种中断有关的定义
#include"MyLibary/12864.h"
#include"MyLibary/12864.c"
#include"MyLibary/pin_map.h"
#include"reg/i2c.h"
#define SLAVE_ADDRESS 0X4C
uint8_t Con_W_L = 0X10;
uint8_t MSB=0x40;
uint8_t LSB=0x00;
void main(void)
{
SysCtlClockSet(SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);//配置系统的时钟频率为50MHZ
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);//使能GPIOF
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);//使能GPIOF
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C2);//使能GPIOF
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
//与I2C有关的GPIO口的配置。
GPIOPinTypeI2C(GPIO_PORTE_BASE,GPIO_PIN_4|GPIO_PIN_5);
GPIOPinConfigure(GPIO_PE4_I2C2SCL);
GPIOPinConfigure(GPIO_PE5_I2C2SDA);
GPIOPadConfigSet(GPIO_PORTE_BASE,GPIO_PIN_5,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD);//SDA配置为open-drain。
// GPIOPadConfigSet(GPIO_PORTE_BASE,GPIO_PIN_4,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD);//SDA配置为open-drain。
GPIOPadConfigSet(GPIO_PORTE_BASE,GPIO_PIN_4,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);//scl配置为弱上拉。
//对I2C的配置。
I2CMasterEnable(I2C2_BASE);//先使能
I2CMasterInitExpClk(I2C2_BASE, SysCtlClockGet(), false);//设置传送速率为100kbps
I2CMasterSlaveAddrSet(I2C2_BASE, SLAVE_ADDRESS, false);//确定从器件的地址,并FALSE表示向从器件写数据。
loop1:
I2CMasterDataPut(I2C2_BASE, Con_W_L);//确定要发的控制数据
I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_SINGLE_SEND); //发送数据。产生起始位,终止位等等。
while(I2CMasterBusy(I2C2_BASE))//发送数据
{
}
if(I2CMasterErr(I2C2_BASE))//有错的处理
goto loop1;
loop2:
I2CMasterDataPut(I2C2_BASE, MSB);//确定要发的控制数据
I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_SINGLE_SEND); //发送数据。产生起始位,终止位等等。
while(I2CMasterBusy(I2C2_BASE))//发送数据
{
}
if(I2CMasterErr(I2C2_BASE))//有错的处理
goto loop2;
loop3:
I2CMasterDataPut(I2C2_BASE, LSB);//确定要发的控制数据
I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_SINGLE_SEND); //发送数据。产生起始位,终止位等等。
while(I2CMasterBusy(I2C2_BASE))//发送数据
{
}
if(I2CMasterErr(I2C2_BASE))//有错的处理
goto loop3;
GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3,0x04);
I2CMasterSlaveAddrSet(I2C2_BASE, SLAVE_ADDRESS, true);//确定从器件的地址,并FALSE表示向从器件读数据。
loop4:
I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE); //发送数据。产生起始位,终止位等等。
MSB = I2CMasterDataGet(I2C2_BASE);//确定要发的控制数据
while(I2CMasterBusy(I2C2_BASE))//发送数据
{
}
if(I2CMasterErr(I2C2_BASE))//有错的处理
goto loop4;
loop5:
I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE); //发送数据。产生起始位,终止位等等。
LSB = I2CMasterDataGet(I2C2_BASE);//确定要发的控制数据
while(I2CMasterBusy(I2C2_BASE))//发送数据
{
}
if(I2CMasterErr(I2C2_BASE))//有错的处理
goto loop5;
loop6:
I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE); //发送数据。产生起始位,终止位等等。
Con_W_L = I2CMasterDataGet(I2C2_BASE);//确定要发的控制数据
while(I2CMasterBusy(I2C2_BASE))//发送数据
{
}
if(I2CMasterErr(I2C2_BASE))//有错的处理
goto loop6;
GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3,0x08);
LCD_init();
lcd12864_display_shu(1,1,Con_W_L);
lcd12864_display_shu(2,1,MSB);
lcd12864_display_shu(3,1,LSB);
while(1)
{
;
}
}
还有可能是硬件出问题了,没有谁有DAC8571的典型应用电路。我在DAC8571的datasheet上没有找到。