2025-09-15 09:03:37 +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
|
2025-09-26 10:17:39 +00:00
|
|
|
|
///@author dufresne
|
|
|
|
|
///@date 2025/09/26
|
2025-09-15 09:03:37 +00:00
|
|
|
|
///
|
|
|
|
|
///@version v1.0 2022/05/26 <20><>ʼ<EFBFBD>汾
|
|
|
|
|
|
|
|
|
|
#include "mb85rc64.h"
|
|
|
|
|
|
2025-09-26 10:17:39 +00:00
|
|
|
|
#ifdef SOFTWARE_I2C
|
2025-09-15 09:03:37 +00:00
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
@ 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()
|
|
|
|
|
{
|
2025-09-26 10:17:39 +00:00
|
|
|
|
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, I2C_SDA_PIN);
|
|
|
|
|
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, I2C_SDA_PIN);
|
2025-09-15 09:03:37 +00:00
|
|
|
|
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()
|
|
|
|
|
{
|
2025-09-26 10:17:39 +00:00
|
|
|
|
gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, I2C_SDA_PIN);
|
|
|
|
|
gpio_output_options_set(GPIOB, GPIO_PUPD_NONE, GPIO_OSPEED_50MHZ, I2C_SDA_PIN);
|
2025-09-15 09:03:37 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
@ 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>ҳд
|
2025-09-29 09:41:58 +00:00
|
|
|
|
@ 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>statues<EFBFBD><EFBFBD>ҳд<EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>ַ<EFBFBD><EFBFBD>
|
2025-09-15 09:03:37 +00:00
|
|
|
|
@ return
|
|
|
|
|
@ note 2022-05-27
|
|
|
|
|
*/
|
2025-09-29 09:41:58 +00:00
|
|
|
|
bool mb85rc64_write_read(unsigned short int addr, unsigned char* data, int data_len, bool statues)
|
2025-09-15 09:03:37 +00:00
|
|
|
|
{
|
2025-09-26 10:17:39 +00:00
|
|
|
|
uint8_t addr_H = 0;
|
|
|
|
|
uint8_t addr_L = 0;
|
2025-09-15 09:03:37 +00:00
|
|
|
|
|
2025-09-26 10:17:39 +00:00
|
|
|
|
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);
|
|
|
|
|
mb85rc64_write_byte(MB85RC64_ADDRESS << 1);
|
|
|
|
|
//ack<63>ź<EFBFBD>
|
|
|
|
|
mb85rc64_ack();
|
|
|
|
|
//д<><D0B4>8λ<38><CEBB>ַ
|
|
|
|
|
mb85rc64_write_byte(addr_H);
|
|
|
|
|
//ack<63>ź<EFBFBD>
|
|
|
|
|
mb85rc64_ack();
|
|
|
|
|
//д<><D0B4>8λ<38><CEBB>ַ
|
|
|
|
|
mb85rc64_write_byte(addr_L);
|
|
|
|
|
//ack<63>ź<EFBFBD>
|
|
|
|
|
mb85rc64_ack();
|
|
|
|
|
|
|
|
|
|
if (statues == PAGE_WRITE)
|
|
|
|
|
{
|
|
|
|
|
for(int i = 0; i < data_len; i++)
|
|
|
|
|
{
|
|
|
|
|
mb85rc64_write_byte(*data);
|
|
|
|
|
mb85rc64_ack();
|
|
|
|
|
data++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (statues == ADDR_READ)
|
|
|
|
|
{
|
|
|
|
|
//<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 << 1) + 1);
|
|
|
|
|
//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)
|
|
|
|
|
{
|
2025-09-29 09:41:58 +00:00
|
|
|
|
master_no_ack();
|
2025-09-26 10:17:39 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2025-09-29 09:41:58 +00:00
|
|
|
|
master_ack();
|
2025-09-26 10:17:39 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//ֹͣ<CDA3>ź<EFBFBD>
|
|
|
|
|
i2c_stop();
|
|
|
|
|
return 1;
|
2025-09-15 09:03:37 +00:00
|
|
|
|
}
|
|
|
|
|
|
2025-09-29 09:41:58 +00:00
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef HARDWARE_I2C
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
@ 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>statues<EFBFBD><EFBFBD>ҳд<EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>ַ<EFBFBD><EFBFBD>
|
|
|
|
|
@ return
|
|
|
|
|
@ note 2022-05-27
|
|
|
|
|
*/
|
|
|
|
|
bool mb85rc64_write_read(unsigned short int addr, unsigned char* data, int data_len, bool statues)
|
2025-09-15 09:03:37 +00:00
|
|
|
|
{
|
2025-09-29 09:41:58 +00:00
|
|
|
|
uint8_t addr_HL[2];
|
|
|
|
|
|
|
|
|
|
addr_HL[0] = (addr >> 8) & 0x00ff;
|
|
|
|
|
addr_HL[1] = addr & 0x00ff;
|
|
|
|
|
|
|
|
|
|
/* <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD> */
|
|
|
|
|
while(i2c_flag_get(I2C_PERIPH, I2C_FLAG_I2CBSY));
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD> */
|
|
|
|
|
i2c_start_on_bus(I2C_PERIPH);
|
|
|
|
|
/* <20>ȴ<EFBFBD><C8B4><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ѷ<EFBFBD><D1B7>ͱ<EFBFBD>־ */
|
|
|
|
|
while(!i2c_flag_get(I2C_PERIPH, I2C_FLAG_SBSEND));
|
|
|
|
|
/* <20><><EFBFBD>ʹӻ<CDB4><D3BB><EFBFBD>ַ<EFBFBD><D6B7>дģʽ<C4A3><CABD> */
|
|
|
|
|
i2c_master_addressing(I2C_PERIPH, MB85RC64_ADDRESS << 1, I2C_TRANSMITTER);
|
|
|
|
|
/* <20>ȴ<EFBFBD><C8B4><EFBFBD>ַ<EFBFBD>ѷ<EFBFBD><D1B7>ͱ<EFBFBD>־ */
|
|
|
|
|
while(!i2c_flag_get(I2C_PERIPH, I2C_FLAG_ADDSEND));
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ͱ<EFBFBD>־ */
|
|
|
|
|
i2c_flag_clear(I2C_PERIPH, I2C_FLAG_ADDSEND);
|
|
|
|
|
|
|
|
|
|
for(int i = 0; i < 2; i++)
|
2025-09-15 09:03:37 +00:00
|
|
|
|
{
|
2025-09-29 09:41:58 +00:00
|
|
|
|
/* <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA> */
|
|
|
|
|
while(!i2c_flag_get(I2C_PERIPH, I2C_FLAG_TBE));
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
i2c_data_transmit(I2C_PERIPH, addr_HL[i]);
|
2025-09-15 09:03:37 +00:00
|
|
|
|
}
|
2025-09-29 09:41:58 +00:00
|
|
|
|
/* <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
while(!i2c_flag_get(I2C_PERIPH, I2C_FLAG_TBE));
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɱ<EFBFBD>־ */
|
|
|
|
|
i2c_flag_clear(I2C_PERIPH, I2C_FLAG_TBE);
|
2025-09-26 10:17:39 +00:00
|
|
|
|
|
|
|
|
|
|
2025-09-29 09:41:58 +00:00
|
|
|
|
if (statues == PAGE_WRITE)
|
|
|
|
|
{
|
|
|
|
|
for(int i = 0; i < data_len; i++)
|
|
|
|
|
{
|
|
|
|
|
/* <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA> */
|
|
|
|
|
while(!i2c_flag_get(I2C_PERIPH, I2C_FLAG_TBE));
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
i2c_data_transmit(I2C_PERIPH, data[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (statues == ADDR_READ)
|
|
|
|
|
{
|
|
|
|
|
// /* <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD> */
|
|
|
|
|
// while(i2c_flag_get(I2C_PERIPH, I2C_FLAG_I2CBSY));
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD> */
|
|
|
|
|
i2c_start_on_bus(I2C_PERIPH);
|
|
|
|
|
/* <20>ȴ<EFBFBD><C8B4><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ѷ<EFBFBD><D1B7>ͱ<EFBFBD>־ */
|
|
|
|
|
while(!i2c_flag_get(I2C_PERIPH, I2C_FLAG_SBSEND));
|
|
|
|
|
/* <20><><EFBFBD>ʹӻ<CDB4><D3BB><EFBFBD>ַ<EFBFBD><D6B7>дģʽ<C4A3><CABD> */
|
|
|
|
|
i2c_master_addressing(I2C_PERIPH, MB85RC64_ADDRESS << 1, I2C_RECEIVER);
|
|
|
|
|
/* <20>ȴ<EFBFBD><C8B4><EFBFBD>ַ<EFBFBD>ѷ<EFBFBD><D1B7>ͱ<EFBFBD>־ */
|
|
|
|
|
while(!i2c_flag_get(I2C_PERIPH, I2C_FLAG_ADDSEND));
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ͱ<EFBFBD>־ */
|
|
|
|
|
i2c_flag_clear(I2C_PERIPH, I2C_FLAG_ADDSEND);
|
2025-09-26 10:17:39 +00:00
|
|
|
|
|
2025-09-29 09:41:58 +00:00
|
|
|
|
/* 5. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
if(data_len > 1)
|
|
|
|
|
{
|
|
|
|
|
/* ʹ<><CAB9>ACK<43><4B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڽ<D6BD><DABD><EFBFBD>ʱ<EFBFBD><CAB1>ҪӦ<D2AA><D3A6><EFBFBD><EFBFBD> */
|
|
|
|
|
i2c_ack_config(I2C_PERIPH, I2C_ACK_ENABLE);
|
|
|
|
|
|
|
|
|
|
for(int i = 0; i < data_len; i++)
|
|
|
|
|
{
|
|
|
|
|
if(i == (data_len - 1))
|
|
|
|
|
{
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ACK */
|
|
|
|
|
i2c_ack_config(I2C_PERIPH, I2C_ACK_DISABLE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* <20>ȴ<EFBFBD>RBNE<4E><45>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿգ<C7BF> */
|
|
|
|
|
while(!i2c_flag_get(I2C_PERIPH, I2C_FLAG_RBNE));
|
|
|
|
|
|
|
|
|
|
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD> */
|
|
|
|
|
data[i] = i2c_data_receive(I2C_PERIPH);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
/* <20><><EFBFBD>ֽڽ<D6BD><DABD>գ<EFBFBD>ֱ<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>ACK */
|
|
|
|
|
i2c_ack_config(I2C_PERIPH, I2C_ACK_DISABLE);
|
|
|
|
|
|
|
|
|
|
/* <20>ȴ<EFBFBD>RBNE<4E><45>־ */
|
|
|
|
|
while(!i2c_flag_get(I2C_PERIPH, I2C_FLAG_RBNE));
|
|
|
|
|
|
|
|
|
|
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD> */
|
|
|
|
|
data[0] = i2c_data_receive(I2C_PERIPH);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD>ֹͣ<CDA3>ź<EFBFBD> */
|
|
|
|
|
i2c_stop_on_bus(I2C_PERIPH);
|
|
|
|
|
/* <20>ȴ<EFBFBD>ֹͣ<CDA3>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
while(I2C_CTL0(I2C_PERIPH) & I2C_CTL0_STOP);
|
2025-09-26 10:17:39 +00:00
|
|
|
|
|
2025-09-29 09:41:58 +00:00
|
|
|
|
return 1;
|
|
|
|
|
}
|
2025-09-26 10:17:39 +00:00
|
|
|
|
|
|
|
|
|
|
2025-09-29 09:41:58 +00:00
|
|
|
|
#endif
|