MW22-02A/BSP/Driver/mb85rc64/mb85rc64.c

363 lines
6.1 KiB
C
Raw Permalink Normal View History

2025-05-21 01:55:40 +00:00
///Copyright (c) 2022, <20>Ĵ<EFBFBD><C4B4><EFBFBD>Դ<EFBFBD><D4B4>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD>޹<EFBFBD>˾
///All rights reserved.
///@file mb85rc64.h
///@brief mb85rc64<36><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B4A2>
///
///@details
///@note
///@author lqc
///@date 2022/05/26
///
///@version v1.0 2022/05/26 <20><>ʼ<EFBFBD>
#include "mb85rc64.h"
/*
@ brief <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@ param
@ return
@ note 2022-5-23
*/
static void delay_us(int us)
{
for(int i = 0; i < us; i++ )
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
}
/*
@ brief оƬ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
@ param
@ return
@ note 2022-05-26
*/
void mb85rc64_gpio_init()
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
rcu_periph_clock_enable(RCU_GPIOB);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ģʽ:PB6
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PB7<42><37><EFBFBD><EFBFBD>ģʽ
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
MB85RC64_SCL_HIGH;
MB85RC64_SDA_HIGH;
}
/*
@ brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>SDA<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
@ param
@ return
@ note 2022-5-26 lqc
*/
static void mb85rc64_sda_output()
{
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
MB85RC64_SDA_HIGH;
}
/*
@ brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>SDA<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
@ param
@ return
@ note 2022-5-26 lqc
*/
static void mb85rc64_sda_input()
{
gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_7);
gpio_output_options_set(GPIOB, GPIO_PUPD_NONE, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
}
/*
@ brief I2C start<EFBFBD>ź<EFBFBD>
@ param
@ return
@ note 2022-5-25
*/
static void i2c_start()
{
MB85RC64_SDA_HIGH;
delay_us(5);
MB85RC64_SCL_HIGH;
delay_us(5);
MB85RC64_SDA_LOW;
delay_us(4);
}
/*
@ brief I2C stop<EFBFBD>ź<EFBFBD>
@ param
@ return
@ note 2022-05-25
*/
static void i2c_stop()
{
MB85RC64_SDA_LOW;
delay_us(5);
MB85RC64_SCL_HIGH;
delay_us(5);
MB85RC64_SDA_HIGH;
delay_us(4);
}
/*
@ brief mb85rc64<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><EFBFBD><EFBFBD>ACK<EFBFBD>ź<EFBFBD>
@ param SDA<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ<EFBFBD><EFBFBD>ʾӦ<EFBFBD><EFBFBD>
@ return
@ note 2022-05-26
*/
static void mb85rc64_ack()
{
int i = 0;
mb85rc64_sda_input();
delay_us(5);
MB85RC64_SCL_HIGH;
delay_us(5);
while((MB85RC64_SDA_GET) && i<1000)
{
i++;
}
delay_us(5);
MB85RC64_SCL_LOW;
delay_us(5);
mb85rc64_sda_output();
}
/*
@ brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><EFBFBD><EFBFBD>ACK<EFBFBD>ź<EFBFBD>,SDAΪ<EFBFBD>͵<EFBFBD>ƽ
@ param SCL<EFBFBD>½<EFBFBD><EFBFBD>ط<EFBFBD><EFBFBD><EFBFBD>
@ return
@ note 2022-05-26
*/
static void master_ack()
{
MB85RC64_SDA_LOW;
delay_us(5);
MB85RC64_SCL_HIGH;
delay_us(5);
MB85RC64_SCL_LOW;
delay_us(5);
}
/*
@ brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>no_ack<EFBFBD>źţ<EFBFBD>SDAΪ<EFBFBD>ߵ<EFBFBD>ƽ
@ param
@ return
@ note 2022-05-26
*/
static void master_no_ack()
{
MB85RC64_SDA_HIGH;
delay_us(5);
MB85RC64_SCL_HIGH;
delay_us(5);
MB85RC64_SCL_LOW;
delay_us(5);
}
/*
@ brief дһ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@ param
@ return
@ note 2022-05-26
*/
static void mb85rc64_write_byte(uint8_t byte)
{
for(int i = 0; i < 8; i++)
{
MB85RC64_SCL_LOW;
delay_us(5);
if(byte & 0x80)
{
MB85RC64_SDA_HIGH;
}
else
{
MB85RC64_SDA_LOW;
}
MB85RC64_SCL_HIGH;
delay_us(5);
byte <<= 1;
}
MB85RC64_SCL_LOW;
}
/*
@ brief <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@ param
@ return
@ note 2022-05-26
*/
static uint8_t mb85rc64_read_byte()
{
uint8_t value = 0;
MB85RC64_SCL_LOW;
delay_us(5);
mb85rc64_sda_input();
for(int i = 0; i < 8; i++)
{
value <<= 1;
MB85RC64_SCL_LOW;
delay_us(5);
MB85RC64_SCL_HIGH;
delay_us(5);
if(MB85RC64_SDA_GET)
{
value = value | 0x01;
}
else {
value = value & 0xfe;
}
}
MB85RC64_SCL_LOW;
delay_us(5);
mb85rc64_sda_output();
return value;
}
/*
@ brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>ҳд
@ param addr:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĵ<EFBFBD>ַ<EFBFBD><EFBFBD>data:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>data_len<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵij<EFBFBD><EFBFBD><EFBFBD>
@ return
@ note 2022-05-27
*/
char mb85rc64_page_write(unsigned short int addr, unsigned char* data, int data_len)
{
uint8_t addr_H = 0;
uint8_t addr_L = 0;
addr_H = (addr >> 8) & 0x00ff;
addr_L = addr & 0x00ff;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>
i2c_start();
//д<><D0B4>ַ,R/Wλ=0
mb85rc64_write_byte(MB85RC64_ADDRESS_WRITE);
//ack<63>ź<EFBFBD>
mb85rc64_ack();
//д<><D0B4><38><CEBB>ַ
mb85rc64_write_byte(addr_H);
//ack<63>ź<EFBFBD>
mb85rc64_ack();
//д<><D0B4><38><CEBB>ַ
mb85rc64_write_byte(addr_L);
//ack<63>ź<EFBFBD>
mb85rc64_ack();
for(int i = 0; i < data_len; i++)
{
mb85rc64_write_byte(*data);
mb85rc64_ack();
data++;
}
//ֹͣ<CDA3>ź<EFBFBD>
i2c_stop();
return 1;
}
/*
@ brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@ param addr :<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>ݵĵ<EFBFBD>ַ<EFBFBD><EFBFBD>data:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, data_len:<EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD>
@ return
@ note 2022-05-27 lqc
*/
char mb85rc64_add_read(unsigned short int addr, unsigned char *data, int data_len)
{
uint8_t addr_H = 0;
uint8_t addr_L = 0;
addr_H = (addr >> 8) & 0x00ff;
addr_L = addr & 0x00ff;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>
i2c_start();
//д<><D0B4>ַ<EFBFBD><D6B7>R/WλΪ0
mb85rc64_write_byte(MB85RC64_ADDRESS_WRITE);
//ack<63>ź<EFBFBD>
mb85rc64_ack();
//д<><D0B4><38><CEBB>ַ
mb85rc64_write_byte(addr_H);
//ack<63>ź<EFBFBD>
mb85rc64_ack();
//д<><D0B4><38><CEBB>ַ
mb85rc64_write_byte(addr_L);
//ack<63>ź<EFBFBD>
mb85rc64_ack();
//<2F><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>
i2c_start();
//д<><D0B4>ַ<EFBFBD><D6B7>R/WΪΪ1<CEAA><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mb85rc64_write_byte(MB85RC64_ADDRESS_READ);
//ack<63>ź<EFBFBD>
mb85rc64_ack();
for(int i = 0; i < data_len; i++)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
data[i] = mb85rc64_read_byte();
if(i == data_len - 1)
{
master_no_ack();
}
else
{
master_ack();
}
}
//ֹͣ<CDA3>ź<EFBFBD>
i2c_stop();
return 1;
}
void read_mb_id(uint8_t* buff)
{
i2c_start();
mb85rc64_write_byte(0xf8);
mb85rc64_ack();
mb85rc64_write_byte(MB85RC64_ADDRESS_WRITE);
mb85rc64_ack();
i2c_start();
mb85rc64_write_byte(0xf9);
mb85rc64_ack();
for(int i = 0; i < 3; i++)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
buff[i] = mb85rc64_read_byte();
if(i == 3 - 1)
{
master_no_ack();
}
else
{
master_ack();
}
}
i2c_stop();
}