这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 在AT32F403A中,你可以使用SPII2SDataTransmit函数来发送

共2条 1/1 1 跳转至

在AT32F403A中,你可以使用SPII2SDataTransmit函数来发送

菜鸟
2025-06-04 17:15:42     打赏

93C46是一款串行EEPROM(电可擦可编程只读存储器),通常使用SPI进行通信。根据93C46的规格,它的操作码通常是3位的。

对于AT32F403A的硬件SPI模块,通常是可以发送任意位数的数据的,因此可以发送3位的操作码。SPI接口通常有一个发送数据寄存器,你可以使用该寄存器来发送操作码和其他数据。

在AT32F403A中,你可以使用SPI_I2S_DataTransmit函数来发送数据。以下是一个简单的示例代码,演示了如何使用硬件SPI来读写93C46,并发送3位的操作码:

复制

#include "AT32f4xx.h"

// 初始化SPI
void SPI_Init() {
    // 选择SPI控制器
    SPIx = SPI1;
   
    // 使能SPI时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
   
    // 配置SPI参数
    SPI_InitTypeDef SPI_InitStructure;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master; // 主模式
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // 全双工模式
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // 数据位宽8位
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; // 时钟极性为低电平
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; // 时钟相位为第一边沿
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // 使用软件控制片选
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; // 波特率分频256
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; // 先发送最高位
    SPI_Init(SPIx, &SPI_InitStructure);
   
    // 使能SPI
    SPI_Cmd(SPIx, ENABLE);
}

// 读取93C46
uint8_t read_93C46(uint8_t opcode, uint8_t address) {
    // 发送操作码和地址
    SPI_I2S_SendData(SPIx, opcode);
    while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
    uint8_t received_data = SPI_I2S_ReceiveData(SPIx);
   
    SPI_I2S_SendData(SPIx, address);
    while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
    received_data = SPI_I2S_ReceiveData(SPIx);
   
    // 读取数据
    SPI_I2S_SendData(SPIx, 0x00); // 发送一个空字节,以便从93C46读取数据
    while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
    received_data = SPI_I2S_ReceiveData(SPIx);
   
    return received_data;
}

// 写入93C46
void write_93C46(uint8_t opcode, uint8_t address, uint8_t data) {
    // 发送操作码和地址
    SPI_I2S_SendData(SPIx, opcode);
    while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
    uint8_t received_data = SPI_I2S_ReceiveData(SPIx);
   
    SPI_I2S_SendData(SPIx, address);
    while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
    received_data = SPI_I2S_ReceiveData(SPIx);
   
    // 写入数据
    SPI_I2S_SendData(SPIx, data);
    while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
    received_data = SPI_I2S_ReceiveData(SPIx);
}

int main() {
    // 初始化SPI
    SPI_Init();
   
    // 读取93C46的数据
    uint8_t opcode = 0b110; // 示例操作码,根据需要修改
    uint8_t address = 0b0101; // 示例地址,根据需要修改
    uint8_t data = read_93C46(opcode, address);
   
    // 写入93C46的数据

复制

    // 示例数据,根据需要修改
    uint8_t write_data = 0xAB;

    // 写入93C46的数据
    write_93C46(opcode, address, write_data);

    while (1) {
        // 循环执行其他任务
    }
}

// 读取93C46
uint8_t read_93C46(uint8_t opcode, uint8_t address) {
    // 发送操作码和地址
    SPI_I2S_SendData(SPIx, opcode << 5 | address);
    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
    uint8_t received_data = SPI_I2S_ReceiveData(SPIx);

    // 读取数据
    SPI_I2S_SendData(SPIx, 0x00); // 发送一个空字节,以便从93C46读取数据
    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
    received_data = SPI_I2S_ReceiveData(SPIx);

    return received_data;
}

// 写入93C46
void write_93C46(uint8_t opcode, uint8_t address, uint8_t data) {
    // 发送操作码、地址和数据
    SPI_I2S_SendData(SPIx, opcode << 5 | address);
    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
    uint8_t received_data = SPI_I2S_ReceiveData(SPIx);

    // 写入数据
    SPI_I2S_SendData(SPIx, data);
    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
    received_data = SPI_I2S_ReceiveData(SPIx);
}



专家
2025-06-04 20:26:34     打赏
2楼

感谢分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]