Hi,
项目需要用到实时时钟模块搭配CC3200工作,目前选择的实时时钟模块是DS1302模块,它有三个引脚 RST、SCLK、DATA。
请帮助看下思路是否正确,对IO口的配置是否正确,有没有更好的建议?
谢谢,可能你们认为是很简单的一个问题,但是就会卡死我们这些新学者,请及时点拨。谢谢!
我的做法为:
Step1.配置引脚RST、SCLK为输出模式,
即 MAP_PRCMPeripheralClkEnable(PRCM_GPIOA1, PRCM_RUN_MODE_CLK);
MAP_PinTypeGPIO(PIN_64, PIN_MODE_0, false);
MAP_GPIODirModeSet(GPIOA1_BASE, 0x2, GPIO_DIR_MODE_OUT);
MAP_PinTypeGPIO(PIN_02, PIN_MODE_0, false);
MAP_GPIODirModeSet(GPIOA1_BASE, 0x8, GPIO_DIR_MODE_OUT);
Step2. DATA引脚,在往DS1302写数据时配置为输出,从DS1302读数据时配置为输入,每次读取和写入切换时都重新配置引脚属性。
void SetDataInput(void)
{
MAP_PinTypeGPIO(PIN_01, PIN_MODE_0, false);
MAP_GPIODirModeSet(GPIOA1_BASE, 0x4, GPIO_DIR_MODE_IN);
}
void SetDataOutput(void)
{
MAP_PinTypeGPIO(PIN_01, PIN_MODE_0, false);
MAP_GPIODirModeSet(GPIOA1_BASE, 0x4, GPIO_DIR_MODE_OUT);
}
Step3.读数据,
char read_1302(char cmd)
{
char i,dat,temp;
SetDataOutput();
cmd|=0x01;
write_1302_byte(cmd);//读完之后时钟复位,时序又匹配不上,所以方案还是不行
GPIO_IF_LedOn(MCU_ORANGE_LED_GPIO); SetDataInput();
GPIO_IF_LedOff(MCU_RED_LED_GPIO);
GPIO_IF_LedOn(MCU_GREEN_LED_GPIO);
for(i=0;i<8;i++)
{
GPIO_IF_LedOn(MCU_RED_LED_GPIO);
MAP_UtilsDelay(20);
temp=GPIO_ReadOutputDataBit();
if(temp) dat|=0x80;
GPIO_IF_LedOff(MCU_RED_LED_GPIO);//下降沿读取
dat>>=1;
MAP_UtilsDelay(5);
//GPIO_IF_LedOff(MCU_RED_LED_GPIO);
}
//GPIO_IF_LedOff(MCU_RED_LED_GPIO);
GPIO_IF_LedOff(MCU_GREEN_LED_GPIO); //禁止数据传递
MAP_UtilsDelay(3);
dat=((dat&0x70)>>4)*10+(dat&0x0f);//bcd码转换
return (dat); //将读出的数据返回
}
void write_1302_byte(char temp)
{ SetDataOutput();
GPIO_IF_LedOff(MCU_RED_LED_GPIO);
MAP_UtilsDelay(3);
GPIO_IF_LedOn(MCU_GREEN_LED_GPIO);
MAP_UtilsDelay(3); char i;
for(i=0;i<8;i++)
{
GPIO_IF_LedOff(MCU_RED_LED_GPIO);
if(temp&0x01)
GPIO_IF_LedOn(MCU_ORANGE_LED_GPIO);//从低字节开始传送
else
GPIO_IF_LedOff(MCU_ORANGE_LED_GPIO);
temp>>=1;//右移 1 位
GPIO_IF_LedOn(MCU_RED_LED_GPIO);//高电平时写入数据、
MAP_UtilsDelay(10);
}
GPIO_IF_LedOff(MCU_GREEN_LED_GPIO);
}
该方法还没成功,我想先排除IO口配置的因素,如果配置正确,那么我就再次排查时序是否正确。
Yonghua Pan:
SCLK是需要给出稳定的clock的吧,你是不是需要用PWM分频去做。 RST和DAT倒是可以用普通的GPIO去做。