hhhhhhhaa 发表于 2018-8-9 14:34:53

stm103vct6与8563通讯

本帖最后由 安 于 2018-8-9 15:32 编辑

求助各位大神查看一下程序有什么问题,在运行后,大约几秒钟程序就停止了

# include <stm32f10x.h>
# include <stdio.h>
void RCC_Configuration(void);
void GPIO_Configuration(void);
void I2C_Configuration(void);
void init_8563(void);
void gettime_8563(unsigned char time);
unsigned char me;
u32 i;
int main(void)
{
   
RCC_Configuration();
    GPIO_Configuration();
    I2C_Configuration();

for(i=3;i<999;i++)
{
    i--;
    gettime_8563(me);
}
   
}   
void RCC_Configuration(void)//ÅäÖÃRCC
{
    //----------ʹÓÃÍⲿRC¾§Õñ-----------
    RCC_DeInit();            //³õʼ»¯ÎªÈ±Ê¡Öµ
    RCC_HSEConfig(RCC_HSE_ON);    //ʹÄÜÍⲿµÄ¸ßËÙʱÖÓ
    while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);    //µÈ´ýÍⲿ¸ßËÙʱÖÓʹÄܾÍÐ÷
   
    //FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);    //Enable Prefetch Buffer
    //FLASH_SetLatency(FLASH_Latency_2);      //Flash 2 wait state
   
    RCC_HCLKConfig(RCC_SYSCLK_Div1);      //HCLK = SYSCLK
    RCC_PCLK2Config(RCC_HCLK_Div1);            //PCLK2 =HCLK
    RCC_PCLK1Config(RCC_HCLK_Div2);            //PCLK1 = HCLK/2
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);    //PLLCLK = 8MHZ * 9 =72MHZ
    RCC_PLLCmd(ENABLE);            //Enable PLLCLK

    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {   
    }      //Wait till PLLCLK is ready
   
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);    //Select PLL as system clock
    while(RCC_GetSYSCLKSource()!=0x08)
    {
    }      //Wait till PLL is used as system clock source
   
    //---------´ò¿ªÏàÓ¦ÍâÉèʱÖÓ--------------------
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_USART1,ENABLE);    //ʹÄÜAPB2ÍâÉèµÄGPIOAµÄʱÖÓ   
                                                            //ʹÄÜAPB2ÍâÉèµÄGPIOCµÄʱÖÓ
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);   
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR,ENABLE);
    //GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);   
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
}
void GPIO_Configuration(void)//ÅäÖÃgpio
{
GPIO_InitTypeDef GPIO_InitStructure;
   
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
      
}

void I2C_Configuration(void)//ÅäÖÃICC
{
I2C_InitTypeDefI2C_InitStructure;

// I2C configuration
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0xa2;//I2C1_SLAVE_ADDRESS7;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 100000;//I2C_Speed;

I2C_Cmd(I2C1, ENABLE);
I2C_Init(I2C1, &I2C_InitStructure);
}

void gettime_8563(unsigned char time)    //´Ó8563¶Áȡʱ¼ä   
{
    unsigned char data_buff;
    unsigned char i;

    //start=i2c_start();
I2C_GenerateSTART(I2C1, ENABLE);
// Test on EV5 and clear it
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
   
    //sendbyte=i2c_send_byte(0x0a2);
    I2C_Send7bitAddress(I2C1, 0xa2, I2C_Direction_Transmitter);
// Test on EV6 and clear it
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

    //sendbyte=i2c_send_byte(0x02);
I2C_SendData(I2C1, 0x02);
/* Test on EV8 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
   
    //start=i2c_start();
I2C_GenerateSTART(I2C1, ENABLE);

// Test on EV5 and clear it
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
   
    //sendbyte=i2c_send_byte(0x0a3);
    I2C_Send7bitAddress(I2C1, 0xa3, I2C_Direction_Receiver);
/* Test on EV6 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
   
    //i2c_receive_data(data_buff,7);
   
      for(i=0;i<7;i++)
    {   
      while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
      if(i==5)
      I2C_AcknowledgeConfig(I2C1, DISABLE);/* Disable Acknowledgement */
      if(i==6)
          I2C_GenerateSTOP(I2C1, ENABLE);
      data_buff=I2C_ReceiveData(I2C1);
    }
    //i2c_stop();
    I2C_AcknowledgeConfig(I2C1, ENABLE);
   
   
    time=data_buff&0x7f;    //sec
    time=data_buff&0x7f;    //min
    time=data_buff&0x3f;    //hour
    time=data_buff&0x3f;    //date
    time=data_buff&0x07;    //week
    time=data_buff&0x1f;    //month
    time=data_buff;                //year



   
}




hhhhhhhaa 发表于 2018-8-9 14:37:12

:'(:'(:'(:'(:'(:'(:'(:'(:'(:'(:'(:'(:'(:'(

hhhhhhhaa 发表于 2018-8-9 14:37:30

:Q:Q:Q:Q:Q:Q:Q:Q:Q纠结啊 该怎么做呢

发表于 2018-8-9 15:33:58

停到哪儿了?最好是仿真一下,读取到的时间是否正确?我看你的代码一直在那里读取时间。

wudianjun2001 发表于 2018-8-9 17:04:14

读时间的话定时读就可以了,不行的话先网上找个IO口模拟IIC的程序先试试,我一般都喜欢用模拟的,不喜欢MCU自带的IIC

huangyanga 发表于 2018-8-9 18:22:22

data_buff=I2C_ReceiveData(I2C1);
---------确定这样写可以?整数赋给一个指针了

feixiang20 发表于 2018-8-10 00:04:59

指针和中断有问题吗,加一个看看呢
IIC_Stop(); //产生一个停止条件
delay_ms(10);

freeelectron 发表于 2018-8-10 08:57:40

1、很明显在while循环里面出不来了,一般这种都会配合超时来处理,万一外设坏了呢?
2、从机地址对不对,能不能读到?
3、示波器或者逻辑分析仪抓时需,看看

hhhhhhhaa 发表于 2018-8-10 10:49:41

安 发表于 2018-8-9 15:33
停到哪儿了?最好是仿真一下,读取到的时间是否正确?我看你的代码一直在那里读取时间。 ...

读取的太频繁了,导致整个系统崩溃了,加了一个延时就好了,据说可以把读取放到定时器里定时读取,怎么编写定时器呢?

hhhhhhhaa 发表于 2018-8-10 10:50:27

freeelectron 发表于 2018-8-10 08:57
1、很明显在while循环里面出不来了,一般这种都会配合超时来处理,万一外设坏了呢?
2、从机地址对不对,能 ...

就是想让它一直读8563里的时间,结果就是太频繁了,加了一个延时就好了
读取的太频繁了,导致整个系统崩溃了,加了一个延时就好了,据说可以把读取放到定时器里定时读取,怎么编写定时器呢?
页: [1] 2 3
查看完整版本: stm103vct6与8563通讯