DOC

STM32-18B20-24C02

By Cheryl Lane,2014-09-23 17:36
8 views 0
STM32-18B20-24C02C,stm32,18b20

//24c02.c//

    #include "stm32f10x.h"

    #include "systic.h"

// SCL = GPIOD_Pin_2

    // SDA = GPIOD_Pin_1

    uint8_t ask;

    void start_iic(void){

     GPIO_SetBits(GPIOD,GPIO_Pin_1);

     Delay_us(1);

     GPIO_SetBits(GPIOD,GPIO_Pin_2);

     Delay_us(5); //大于4.7us

     GPIO_ResetBits(GPIOD,GPIO_Pin_1);

     Delay_us(5); //锁住>4us

     GPIO_ResetBits(GPIOD,GPIO_Pin_2); //钳住iic总线!准备收发数据。

     Delay_us(2);

    }

void stop_iic(void){

     GPIO_ResetBits(GPIOD,GPIO_Pin_1);

     Delay_us(2);

     GPIO_SetBits(GPIOD,GPIO_Pin_2);

     Delay_us(5);

     GPIO_SetBits(GPIOD,GPIO_Pin_1);

     Delay_us(5);

    }

void sendbyte(uint8_t ch){

     uint8_t i;

     for(i=0;i<8;i++){ //high

     if((ch<<i)&0x80)

     GPIO_SetBits(GPIOD,GPIO_Pin_1);

     else

     GPIO_ResetBits(GPIOD,GPIO_Pin_1);

     Delay_us(1);

     GPIO_SetBits(GPIOD,GPIO_Pin_2);

     Delay_us(5);

     GPIO_ResetBits(GPIOD,GPIO_Pin_2);

     Delay_us(1);

     }

     GPIO_SetBits(GPIOD,GPIO_Pin_1);

     Delay_us(2);

     GPIO_SetBits(GPIOD,GPIO_Pin_2);

     Delay_us(2);

     if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1)==1)

     ask=0;

     else

     ask=1;

     GPIO_ResetBits(GPIOD,GPIO_Pin_2);

     Delay_us(1);

}

    uint8_t recbyte(void){

     uint8_t buf;

     uint8_t i;

     buf=0;

     GPIO_SetBits(GPIOD,GPIO_Pin_1);

     for(i=0;i<8;i++){

     Delay_us(2);

     GPIO_ResetBits(GPIOD,GPIO_Pin_2);

     Delay_us(5);

     GPIO_SetBits(GPIOD,GPIO_Pin_2);

     Delay_us(1);

     buf<<=1;

     if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1)==1)

     buf+=1;

     Delay_us(2);

     }

     //GPIO_ConfigDOUT();

     GPIO_ResetBits(GPIOD,GPIO_Pin_2);

     Delay_us(2);

     return buf;

    }

void Asko(void){

     GPIO_ResetBits(GPIOD,GPIO_Pin_1);

     Delay_us(2);

     GPIO_SetBits(GPIOD,GPIO_Pin_2);

     Delay_us(5);

     GPIO_ResetBits(GPIOD,GPIO_Pin_2);

     Delay_us(2);

    }

    void Noask(void){

     GPIO_SetBits(GPIOD,GPIO_Pin_1);

     Delay_us(2);

     GPIO_SetBits(GPIOD,GPIO_Pin_2);

     Delay_us(5);

     GPIO_ResetBits(GPIOD,GPIO_Pin_2);

     Delay_us(2);

}

uint8_t Sendstr(uint8_t add,uint8_t cadd,uint8_t *buf,uint8_t n){

     uint8_t i;

     start_iic();

     sendbyte(add);

     if(ask==0)

     return 0;

     sendbyte(cadd);

     if(ask==0)

     return 0;

     for(i=0;i<n;i++){

     sendbyte(*buf);

     if(ask==0)

     return 0;

     buf++;

     cadd++;

     }

     Delay_us(1000000);

     stop_iic();

     return 1;

}

uint8_t Recstr(uint8_t add,uint8_t cadd,uint8_t *buf,uint8_t n){

     uint8_t i;

     start_iic();

     sendbyte(add);

     if(ask==0)

     return 0;

     sendbyte(cadd);

     if(ask==0)

     return 0;

     start_iic();

     sendbyte(add+1);

     if(ask==0)

     return 0;

     for(i=0;i<n-1;i++){

     *buf=recbyte();

     Asko();

     buf++;

     }

     *buf=recbyte(); //主机作为接收器时!数据最后一个字节后

     Noask(); //必须跟一个“不应答”表示结束接收

     Delay_us(1000000);

     stop_iic();

     return 1;

}

//////////////////////usart.c////////////////////////////////

    #include "stm32f10x.h"

    #include "usart.h"

    #include <stdio.h>

    #define SENDBUFF_SIZE 1024

    extern vu8 SendBuff[SENDBUFF_SIZE] ;

    extern uint16_t temp;

    extern uint8_t RecBuff[1024];

void GPIO_Config(void)

    {

     GPIO_InitTypeDef GPIO_InitStruct;

     GPIO_InitStruct.GPIO_Mode= GPIO_Mode_AF_PP; //USART1 TX

     GPIO_InitStruct.GPIO_Pin= GPIO_Pin_9;

     GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

     GPIO_Init(GPIOA, &GPIO_InitStruct);

     GPIO_InitStruct.GPIO_Mode= GPIO_Mode_Out_OD;/IIC EEPRM 外接3.3V/4.7K

     GPIO_InitStruct.GPIO_Pin= GPIO_Pin_1|GPIO_Pin_2;

     GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

     GPIO_Init(GPIOD, &GPIO_InitStruct);

     GPIO_InitStruct.GPIO_Mode= GPIO_Mode_IN_FLOATING; //USART1 RX

     GPIO_InitStruct.GPIO_Pin= GPIO_Pin_10;

     GPIO_Init(GPIOA, &GPIO_InitStruct);

     GPIO_InitStruct.GPIO_Mode= GPIO_Mode_Out_PP; //LED

     GPIO_InitStruct.GPIO_Pin= GPIO_Pin_6|GPIO_Pin_9;

     GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

     GPIO_Init(GPIOB, &GPIO_InitStruct);

     GPIO_InitStruct.GPIO_Mode= GPIO_Mode_Out_PP; //18B20

     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;

     GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

     GPIO_Init(GPIOC, &GPIO_InitStruct);

     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; //EXTI0 KEY1

     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD; // 上拉输入

     GPIO_Init(GPIOC, &GPIO_InitStruct);

}

void USART1_Config(void)

    {

     USART_InitTypeDef USART_InitStructure;

     USART_InitStructure.USART_BaudRate = 9600;

     USART_InitStructure.USART_WordLength = USART_WordLength_8b;

     USART_InitStructure.USART_StopBits = USART_StopBits_1;

     USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验

     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

     USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;

     USART_Init(USART1, &USART_InitStructure);

     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

     //USART_ITConfig(USART1, USART_IT_TC, ENABLE);

     USART_Cmd(USART1, ENABLE);

    }

void DMAT_Config(void)

    { //uint8_t n;

     DMA_InitTypeDef DMA_InitStructure;

    // for(n=0;n<6;n++)

    // SendBuf[n]=n+'0';

     DMA_DeInit(DMA1_Channel4);//USART1DMA1传送通道 CHANNEL 4

     DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_BASE+4; //地址

     DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)RecBuff; //地址

    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//DMA的目的

    DMA_InitStructure.DMA_BufferSize = 6; //传输大小

     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不增加

     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址自增 1

null

     if (HSEStartUpStatus == SUCCESS) {

     /* Set PLL clock output to 72MHz using HSE (8MHz) as entry clock */

     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //* 利用锁相环讲外

    8Mhz晶振9倍频到72Mhz */

     RCC_PLLCmd(ENABLE); //* Enable PLL

     while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //* Wait till PLL is ready

     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //* Select PLL as system clock source

     while (RCC_GetSYSCLKSource() != 0x08); //* Wait till PLL is used as system clock source

     RCC_HCLKConfig(RCC_SYSCLK_Div1); //* HCLK = SYSCLK

     RCC_PCLK2Config(RCC_HCLK_Div1); //* PCLK2 = HCLK

     RCC_PCLK1Config(RCC_HCLK_Div2); //* PCLK1 = HCLK/2

     }

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);

     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOD, ENABLE);

     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

}

//<