今晚捣鼓了一下AT24C04,模拟时序,开漏输出。
代码:
#include "main.h"
/** @addtogroup Projects_Examples_MD
* @{
*/
/** @addtogroup Examples
* @{
*/
#define uchar unsigned char
#define uint unsigned int
#define SDA_L md_gpio_set_pin_low(SDA_GPIO_PORT, SDA_GPIO_PIN);
#define SDA_H md_gpio_set_pin_high(SDA_GPIO_PORT, SDA_GPIO_PIN);
#define SDA md_gpio_get_input_data(SDA_GPIO_PORT, SDA_GPIO_PIN)
#define SCL_L md_gpio_set_pin_low(SCL_GPIO_PORT, SCL_GPIO_PIN);
#define SCL_H md_gpio_set_pin_high(SCL_GPIO_PORT, SCL_GPIO_PIN);
unsigned char buffer[3];
/****************************************************************************
* ? ?: DelayMS()
* ? ?: ????????,???????????16M(??????????)
* ????: msec ????,???,????
* ????: ?
****************************************************************************/
void DelayMS(uint msec)
{
uint i,j;
for (i=0; i
/****************************************************************************
* ? ?: InitLed()
* ? ?: ??LED????IO?
* ????: ?
* ????: ?
****************************************************************************/
void InitSDAInput(void)
{
md_gpio_set_pin_function(SDA_GPIO_PORT, SDA_GPIO_PIN, GPIO_FUNC_1);
md_gpio_set_pin_push_pull(SDA_GPIO_PORT, SDA_GPIO_PIN);
md_gpio_set_pin_mode_input(SDA_GPIO_PORT, SDA_GPIO_PIN);
}
void InitSDAOutput(void)
{
md_gpio_set_pin_function(SDA_GPIO_PORT, SDA_GPIO_PIN, GPIO_FUNC_1);
md_gpio_set_pin_push_pull(SDA_GPIO_PORT, SDA_GPIO_PIN);
md_gpio_set_pin_mode_output(SDA_GPIO_PORT, SDA_GPIO_PIN);
md_gpio_set_pin_open_drain(SDA_GPIO_PORT, SDA_GPIO_PIN);
}
//-----------------------------------------------------------------------------------------
//????:Delay()
//? ?:?????
//-----------------------------------------------------------------------------------------
void Delay(unsigned char us) //5,7,9
{
while(--us);
}
//-----------------------------------------------------------------------------------------
//????:Delayms()
//-----------------------------------------------------------------------------------------
void Delayms(unsigned int ims)
{
unsigned int i,j;
for(i=0;i
void Start()
{
InitSDAOutput();
SCL_H;
Delay(10);
SDA_H;
Delay(10);
SDA_L;
Delay(10);
SCL_L;
Delay(10);
}
void Stop()
{
InitSDAOutput();
SDA_L;
Delay(10);
SCL_H;
Delay(10);
SDA_H;
Delay(10);
}
char ACK ()
{
char c;
InitSDAOutput();
SDA_H;
Delay(10);
SCL_H;
Delay(10);
InitSDAInput();
Delay(10);
if(SDA)
c=1;
else
c=0;
Delay(10);
InitSDAOutput();
Delay(10);
SCL_L;
Delay(10);
return c;
}
void SendChar(unsigned char ch)
{
unsigned char i;
i=8;
InitSDAOutput();
do
{
if((ch&0x80)==0x80)
SDA_H;
if((ch&0x80)==0x00)
SDA_L;
Delay(10);
SCL_H;
Delay(10);
SCL_L;
Delay(10);
ch<<=1;
}while(--i!=0);
}
unsigned char RecChar()
{
unsigned char i,j;
i=8;
j=0;
InitSDAInput();
Delay(10);
do
{
SCL_H;
Delay(10);
j=(j<<1> if(SDA)
j=j|SDA;
Delay(10);
SCL_L;
Delay(10);
}while(--i!=0);
InitSDAOutput();
return j;
}
void WriteChar(unsigned int addr,unsigned char ch)
{
unsigned char c;
c=((*((unsigned char *)&addr))<<1>
Start();
SendChar(0xa0|c);
ACK();
SendChar(addr);
ACK();
SendChar(ch);
ACK();
Stop();
for(ch=0xff;ch!=0;ch--) ;
}
unsigned char ReadChar(unsigned int addr)
{
unsigned char ch;
ch=((*((unsigned char *)&addr))<<1>
Start();
SendChar(0xa0|ch);
ACK();
SendChar(addr);
ACK();
Start();
SendChar(0xa1|ch);
ACK();
ch=RecChar();
Stop();
return ch;
}
/**
* @brief This function configures GPIO
* @param None
* @retval None
*/
void config_gpio(void)
{
// md_gpio_set_pin_function(CLOCK_GPIO_PORT, CLOCK_GPIO_PIN, GPIO_FUNC_1);
// md_gpio_set_pin_push_pull(CLOCK_GPIO_PORT, CLOCK_GPIO_PIN);
// md_gpio_set_pin_mode_input(CLOCK_GPIO_PORT, CLOCK_GPIO_PIN);
md_gpio_set_pin_function(SDA_GPIO_PORT, SDA_GPIO_PIN, GPIO_FUNC_1);
md_gpio_set_pin_push_pull(SDA_GPIO_PORT, SDA_GPIO_PIN);
md_gpio_set_pin_mode_output(SDA_GPIO_PORT, SDA_GPIO_PIN);
md_gpio_set_pin_open_drain(SDA_GPIO_PORT, SDA_GPIO_PIN);
md_gpio_set_pin_function(SCL_GPIO_PORT, SCL_GPIO_PIN, GPIO_FUNC_1);
md_gpio_set_pin_push_pull(SCL_GPIO_PORT, SCL_GPIO_PIN);
md_gpio_set_pin_mode_output(SCL_GPIO_PORT, SCL_GPIO_PIN);
md_gpio_set_pin_open_drain(SCL_GPIO_PORT, SCL_GPIO_PIN);
md_gpio_set_pin_function(LED2_GPIO_PORT, LED2_GPIO_PIN, GPIO_FUNC_1);
md_gpio_set_pin_push_pull(LED2_GPIO_PORT, LED2_GPIO_PIN);
md_gpio_set_pin_mode_output(LED2_GPIO_PORT, LED2_GPIO_PIN);
}
/**
* @brief Test main function
* @retval Status.
*/
int main()
{
md_init_1ms_tick();
config_gpio();
buffer[0]=ReadChar(0);
Delay(100); //??????
WriteChar(0,0x55);
Delayms(20);
WriteChar(1,0xaa);
Delayms(20);
WriteChar(2,0x18);
Delayms(20);
buffer[0]=ReadChar(1);
buffer[1]=ReadChar(2);
buffer[2]=ReadChar(0);
while (1)
{
}
}
效果图:
如果强行把一个16位变量的地址强制转换成指向8位变量的指针,取出的值在大端模式与小端模式是不同的,
比如uint MyVar = 0x1234;
大端模式取到值是0x12,小端模式取到的值是0x34,显然这个代码移植性不好,而且BUG隐藏的很深
一周热门 更多>