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
}
:'(:'(:'(:'(:'(:'(:'(:'(:'(:'(:'(:'(:'(:'( :Q:Q:Q:Q:Q:Q:Q:Q:Q纠结啊 该怎么做呢 停到哪儿了?最好是仿真一下,读取到的时间是否正确?我看你的代码一直在那里读取时间。 读时间的话定时读就可以了,不行的话先网上找个IO口模拟IIC的程序先试试,我一般都喜欢用模拟的,不喜欢MCU自带的IIC data_buff=I2C_ReceiveData(I2C1);
---------确定这样写可以?整数赋给一个指针了 指针和中断有问题吗,加一个看看呢
IIC_Stop(); //产生一个停止条件
delay_ms(10); 1、很明显在while循环里面出不来了,一般这种都会配合超时来处理,万一外设坏了呢?
2、从机地址对不对,能不能读到?
3、示波器或者逻辑分析仪抓时需,看看 安 发表于 2018-8-9 15:33
停到哪儿了?最好是仿真一下,读取到的时间是否正确?我看你的代码一直在那里读取时间。 ...
读取的太频繁了,导致整个系统崩溃了,加了一个延时就好了,据说可以把读取放到定时器里定时读取,怎么编写定时器呢?
freeelectron 发表于 2018-8-10 08:57
1、很明显在while循环里面出不来了,一般这种都会配合超时来处理,万一外设坏了呢?
2、从机地址对不对,能 ...
就是想让它一直读8563里的时间,结果就是太频繁了,加了一个延时就好了
读取的太频繁了,导致整个系统崩溃了,加了一个延时就好了,据说可以把读取放到定时器里定时读取,怎么编写定时器呢?